在計(jì)算機(jī)與外部設(shè)備通信的過(guò)程中,計(jì)算機(jī)通過(guò)串行接口實(shí)時(shí)采集外部設(shè)備發(fā)送來(lái)的數(shù)據(jù) 是非常重要的通信方式之一,本文以計(jì)算機(jī)通過(guò)串行接口實(shí)時(shí)采集電子秤的數(shù)據(jù)為例,詳細(xì)論述了計(jì)算機(jī)串行通信的基本原理、電子秤的通信協(xié)議以及電子秤數(shù)據(jù)解碼,重點(diǎn)論述了利用串行口控件 MSCOM實(shí)現(xiàn)實(shí)時(shí)采集電子秤數(shù)據(jù)的通用方法。
1.引 言
隨著計(jì)算機(jī)的普及與外圍設(shè)備技術(shù)的發(fā)展,計(jì)算機(jī)與外圍設(shè)備之間的通信顯得越來(lái)越重要,串行口通 信是目前計(jì)算機(jī)與外圍設(shè)備之間的重要的通信方式之一。由于串行通信是在一根傳輸線(xiàn)上一位一位的傳送 數(shù)據(jù),其優(yōu)點(diǎn)是使用的傳輸線(xiàn)少,速度快,適合于遠(yuǎn)距離傳輸。但對(duì)于那些與計(jì)算機(jī)相距不遠(yuǎn)的人一機(jī)交 換設(shè)備和串行存儲(chǔ)的外部設(shè)備如終端、打印機(jī)、邏輯分析儀、磁盤(pán)等外部設(shè)備,采用串行方式交換數(shù)據(jù)也 很普遍。在計(jì)算機(jī)對(duì)外部設(shè)備的實(shí)時(shí)控制中,大多采用計(jì)算機(jī)的串行接口與外部設(shè)備進(jìn)行通信,所以串行 接口是計(jì)算機(jī)應(yīng)用系統(tǒng)中常用的接口,而相應(yīng)的接口應(yīng)用程序也成為近年來(lái)研究的熱點(diǎn)。本文旨在通過(guò)計(jì) 算機(jī)串行接口實(shí)時(shí)采集電子秤的數(shù)據(jù)的實(shí)現(xiàn),論述串行口通訊的原理以及如何利用串行口通信控件 MSCOM開(kāi)發(fā)計(jì)算機(jī)的基于串行口的應(yīng)用軟件。
本文在Visual Basic 6.0開(kāi)發(fā)環(huán)境中利用Microsoft Communication控件實(shí)現(xiàn)計(jì)算機(jī)與電子秤的串行通 信。成功地實(shí)現(xiàn)了計(jì)算機(jī)實(shí)時(shí)采集電子秤的數(shù)據(jù),并通過(guò)對(duì)采集到的數(shù)據(jù)進(jìn)行解碼處理并實(shí)時(shí)地將數(shù)據(jù)顯 示于計(jì)算機(jī)應(yīng)用軟件上。
2.串行通訊的基本原理
2.1串行通信原理
串行通信是指外部設(shè)備和計(jì)算機(jī)之間使用一根數(shù)據(jù)信號(hào)線(xiàn),數(shù)據(jù)在一根數(shù)據(jù)信號(hào)線(xiàn)上按位進(jìn)行傳輸,每 一位數(shù)據(jù)都占據(jù)一個(gè)固定的時(shí)間長(zhǎng)度。但是由于高速率的要求,處于計(jì)算機(jī)內(nèi)部的CPU與串口之間的通訊 仍然采用并行的通訊方式,所以串行口的本質(zhì)就是實(shí)現(xiàn)CPU與外圍數(shù)據(jù)設(shè)備的數(shù)據(jù)格式轉(zhuǎn)換(或者稱(chēng)為串 并轉(zhuǎn)換器)和控制信息(起始位和終止位)插入和刪除,即當(dāng)數(shù)據(jù)從外圍設(shè)備輸入計(jì)算機(jī)時(shí),數(shù)據(jù)格式由 位(Bit)轉(zhuǎn)化為字節(jié)(Byte)數(shù)據(jù),并將相應(yīng)的控制信息刪除;反之,當(dāng)計(jì)算機(jī)發(fā)送數(shù)據(jù)到外圍設(shè)備時(shí),串 口又將字節(jié)數(shù)據(jù)轉(zhuǎn)化為位串?dāng)?shù)據(jù),并將控制信息插入到位串?dāng)?shù)據(jù)隊(duì)列。
為實(shí)現(xiàn)串行通信,計(jì)算機(jī)的串行口內(nèi)部結(jié)構(gòu)設(shè)計(jì)如圖1所示,它是個(gè)雙緩沖的串行接口,包括一個(gè)發(fā) 送緩沖區(qū)(SBUF)和一個(gè)接收緩沖區(qū)(SBUF),可以同時(shí)進(jìn)行數(shù)據(jù)的發(fā)送和接收,當(dāng)計(jì)算機(jī)需要向外部設(shè)備發(fā)送數(shù)據(jù)時(shí),CPU首先將數(shù)據(jù)送入SBUF中,然后串行口一位一位向外發(fā)送,當(dāng)一個(gè)字節(jié)全部發(fā)送后,串 行口發(fā)出中斷請(qǐng)求,CPU向緩沖區(qū)SBUF發(fā)送下一個(gè)字節(jié)的數(shù)據(jù);計(jì)算機(jī)接收數(shù)據(jù)時(shí),串行口一位一位將從 外部接收的數(shù)據(jù)送入緩沖區(qū),當(dāng)一個(gè)字節(jié)的數(shù)據(jù)全部接收完以后,向CPU發(fā)出一個(gè)中斷請(qǐng)求,CPU將緩沖 區(qū)的數(shù)據(jù)取走,然后接收下一個(gè)字節(jié)數(shù)據(jù)。計(jì)算機(jī)的串行口與特定的定時(shí)器綁定在一起,通過(guò)該定時(shí)器可 以設(shè)置計(jì)算機(jī)串行口發(fā)送和接收的波特率,以適用不同的外部設(shè)備。
串行口的典型代表是RS-232C及其兼容接口,有9針和25針兩類(lèi)?,F(xiàn)在的臺(tái)式PC機(jī)一般有三個(gè)RS 一232串行口 COM1、COM2和COM3,通常COM1和COM2都使用的是9針D形連接器,而COM3 使用DB25針連接器。其中九針的串行口各針定義如表1所示.
當(dāng)計(jì)算機(jī)通過(guò)串行口與外部設(shè)備進(jìn)行通信時(shí),首先將計(jì)算機(jī)串行口 TXB引腳與外部設(shè)備串行口的RXB 引腳相連,然后將計(jì)算機(jī)的串行口RXD引腳與外部設(shè)備的串行口 TXD引腳相連[1]。計(jì)算機(jī)串行口與外部設(shè)備串行口連接方式如圖2所示。
在本文中,以XK3100 一B2+的電子秤為例,該電子秤帶有一個(gè)9針的RS-232C串行接 口,能與計(jì)算機(jī)進(jìn)行串口數(shù)據(jù)通信,并實(shí)時(shí)傳送檢測(cè)數(shù)據(jù)到計(jì)算 機(jī)。連接時(shí),將連接電子秤串行口和計(jì)算機(jī)串行口的兩個(gè)接頭按 2對(duì)3,3對(duì)2的方式連接,如需要做到實(shí)時(shí)接收數(shù)據(jù),還要將電 子秤的發(fā)送模式調(diào)到“數(shù)據(jù)穩(wěn)定后”或“自動(dòng)”發(fā)送狀態(tài)。
在VB6.0環(huán)境下,米用Microsoft Communication控件來(lái)實(shí)現(xiàn)計(jì)算機(jī)與電子秤之間串行通信,進(jìn)行串行 通信時(shí)只需了解以下四根線(xiàn)的代號(hào)及作用。以下四根線(xiàn)的高電平/低電平狀態(tài)分別對(duì)應(yīng)MSComm控件的相 應(yīng)屬性的True/False值。
DTR線(xiàn):計(jì)算機(jī)中數(shù)據(jù)發(fā)往電子秤,表示計(jì)算機(jī)是否已準(zhǔn)備好。
RTS線(xiàn):計(jì)算機(jī)中數(shù)據(jù)發(fā)往電子秤,表示計(jì)算機(jī)是否允許電子秤發(fā)回?cái)?shù)據(jù)。
DSR線(xiàn):電子秤中數(shù)據(jù)發(fā)往計(jì)算機(jī),表示電子秤是否已做好操作準(zhǔn)備。
CTS線(xiàn):電子秤中數(shù)據(jù)發(fā)往計(jì)算機(jī),表示電子秤是否允許發(fā)送數(shù)據(jù)。
2.2通信方式
在VB6.0環(huán)境下,計(jì)算機(jī)與外部設(shè)備有兩種通訊方式
1、事件驅(qū)動(dòng),它是一種功能強(qiáng)大的處理問(wèn)題的方法。在實(shí)際工作中,往往要處理許多通信中的相關(guān)事件,例如:當(dāng)線(xiàn)路數(shù)據(jù)到達(dá)計(jì)算機(jī)端或RTS信號(hào)線(xiàn)狀態(tài)發(fā)生變化時(shí),要求我們使用相應(yīng)的事件來(lái)跟蹤和處 理,該控件是使用OnComm事件來(lái)實(shí)現(xiàn)的,主要包括檢測(cè)、數(shù)據(jù)處理和通信錯(cuò)誤等方面的問(wèn)題,CommEvent 值返回最近的通信事件或錯(cuò)誤的數(shù)字代碼。
2、查詢(xún)方式。由程序設(shè)計(jì)者負(fù)責(zé)讀取CommEvent的值并處理所發(fā)生的錯(cuò)誤或事件。通常簡(jiǎn)單的應(yīng)用 程序設(shè)計(jì)可采用這種辦法。
2.3串行通信控件的屬性
利用串行通信控件設(shè)計(jì)通信程序,關(guān)鍵是準(zhǔn)確理解和設(shè)置串行通信控件的屬性。在VB6.0中AcdveX控 件MSCOMM.VBX提供了 27個(gè)關(guān)于通信控件方面的屬性,下面就部分屬性分別予以描述:
CommPort屬性:設(shè)置并返回通訊端口號(hào)。
RThreshold 屬性:在 MSComm 控件設(shè)置 CommEvent 屬性為 comEvReceive 并產(chǎn)生 OnComm 之前,設(shè)置并返回的要接收的字符數(shù)。
CTSHolding屬性:確定是否可通過(guò)查詢(xún)Clear To Send (CTS)線(xiàn)的狀態(tài)發(fā)送數(shù)據(jù)。Clear To Send是調(diào)制解調(diào)裝置發(fā)送到相聯(lián)計(jì)算機(jī)的信號(hào),指示傳輸可以進(jìn)行。該屬性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí)為只讀。 SThreshold屬性:MSComm控件設(shè)置CommEvent屬性為ComEvSend并產(chǎn)生OnComm事件之前,設(shè)置并返回傳輸緩沖區(qū)中允許的最小字符數(shù)。
CDHolding屬性:通過(guò)查詢(xún)Carrier Detect (CD)線(xiàn)的狀態(tài)確定當(dāng)前是否有傳輸。Carrier Detect是從調(diào)制解調(diào)裝置發(fā)送到相聯(lián)計(jì)算機(jī)的一個(gè)信號(hào),指示調(diào)制解調(diào)裝置正在聯(lián)機(jī)。該屬性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí) 為只讀。
DSRHolding屬性:確定Data Set Ready (DSR)線(xiàn)的狀態(tài)。Data Set Ready信號(hào)由調(diào)制解調(diào)器發(fā)送到相連計(jì)算機(jī),指示作好操作準(zhǔn)備。該屬性在設(shè)計(jì)時(shí)無(wú)效,在運(yùn)行時(shí)為只讀。
Settings屬性:設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位參數(shù)。
InputLen屬性:設(shè)置并返回Input屬性從接收緩沖區(qū)讀取的字符數(shù)。
EOFEnable屬性:確定在輸入過(guò)程中MSComm控件是否尋找文件結(jié)尾(EOF)字符。如果找到:EOF 字符,將停止輸入并激活OnComm事件,此時(shí)CommEvent屬性設(shè)置為comEvEOF。
3.電子秤的串口通信協(xié)議
本文使用的電子秤是XK3100-B2+型,其串口數(shù)據(jù)通信協(xié)議規(guī)定
如下:
①數(shù)據(jù)傳輸速率可設(shè)置為9600bp、4800bps或2400bps;
②數(shù)據(jù)格式:電子秤采用通用的RS232 UART信號(hào),每10BIT為一個(gè)數(shù)據(jù)幀,幀格式如表2所示.
4.電子秤實(shí)時(shí)數(shù)據(jù)釆集的實(shí)現(xiàn)
在VB6.0環(huán)境下通過(guò)串行通訊實(shí)現(xiàn)電子秤實(shí)時(shí)數(shù)據(jù)采集。
4.1數(shù)據(jù)的采集
在設(shè)計(jì)好計(jì)算機(jī)與電子秤的物理連接后,接著設(shè)計(jì)應(yīng)用軟件實(shí)時(shí)采集電子秤的稱(chēng)重?cái)?shù)據(jù),在VB6.0上 新建一個(gè)“標(biāo)準(zhǔn)EXE”工程,然后選擇“工程/部件”菜單項(xiàng),在“部件”對(duì)話(huà)框中選擇“Microsoft Comm Control 6.0”,即可添加MSComm控件;再在窗體中依次布置如表3所示的控件并設(shè)置其屬性。
為了只要打開(kāi)此窗口即可接收數(shù)據(jù),在Form窗口的程序代碼如下:
Private Sub Form_Load()
MSComm 1. CommPort = 1 ‘使用
串口 1
MSComm 1.PortOpen = True ‘打 開(kāi)串口 1
MSComm 1 .RThreshold = 1 ‘接收 數(shù)據(jù)后產(chǎn)生OnComm事件 End Sub
在設(shè)置完上面的程序后就可以進(jìn)行數(shù) 據(jù)采集,根據(jù)電子秤的協(xié)議規(guī)定電子秤一 次傳輸?shù)氖?/span>6幀數(shù)據(jù),而在接收數(shù)據(jù)后是 采用的16進(jìn)制將數(shù)據(jù)存放的,將它存放到字符串HData中,以便在下個(gè)步驟中對(duì)數(shù) 據(jù)進(jìn)行處理并顯示于計(jì)算機(jī)的屏幕中。
4.2數(shù)據(jù)解碼處理
根據(jù)電子秤發(fā)送的第二幀數(shù)據(jù)D3和D4位的取值決定電子秤的稱(chēng)重模式,其稱(chēng)重模式分別是00計(jì) 重模式;01計(jì)數(shù)模式;10百分比模式.根據(jù)第二幀數(shù)據(jù)的不同取值,分別對(duì)字符串進(jìn)行處理,如表4所 示。然后將第三幀(顯示數(shù)值的最低字節(jié))、第四幀(顯示數(shù)值的中間字節(jié))、第五幀(顯示數(shù)值的最高字節(jié))解碼成十進(jìn)制數(shù);并根據(jù)第六幀數(shù)據(jù)的值確定本次稱(chēng)重是以公斤(00H)為單位還是磅(01H)為 單位。最后將解碼后的數(shù)據(jù)顯示于計(jì)算機(jī)屏幕上。數(shù)據(jù)解碼流程示意圖如圖3所示。
當(dāng)一次稱(chēng)重過(guò)程結(jié)束,可以繼續(xù)下一次的稱(chēng)重,在程序設(shè)計(jì)過(guò)程中必須用程序設(shè)置計(jì)算機(jī)接收的波特 率。以保證計(jì)算機(jī)的接收的波特率和電子秤發(fā)送波特率相一致,不然會(huì)造成數(shù)據(jù)的丟失。
5.結(jié)束語(yǔ)
本文主要論述了基于串行通信的電子秤實(shí)時(shí)數(shù)據(jù)采集原理和實(shí)現(xiàn)方法,重點(diǎn)探討了如何利用高級(jí)語(yǔ)言 通過(guò)串行接口控制外部設(shè)備以實(shí)時(shí)采集數(shù)據(jù),并將采集到的數(shù)據(jù)解碼成用戶(hù)所需的數(shù)據(jù)。很好地解決了電 子秤數(shù)據(jù)的實(shí)時(shí)采集,該方法具有很好的實(shí)用性和通用性,不同的電子秤只需修改解碼參數(shù)就可以適用。