陳萬(wàn)勝
(中煤科工集團(tuán)西安研究院, 陜西 西安 710077)
在很多情況下,遠(yuǎn)程監(jiān)控和工業(yè)自動(dòng)化領(lǐng)域系統(tǒng)常見(jiàn)的通信編程多為串口通信編程.計(jì)算機(jī)串口和并口編程在通信[1-5]軟件中有著十分廣泛的應(yīng)用,如電話、傳真、視頻和控制等.過(guò)去的物探儀器,在采集數(shù)據(jù)后,僅僅把數(shù)據(jù)存入自身的或外部擴(kuò)展的存儲(chǔ)器,有的甚至沒(méi)有存儲(chǔ)器,而是需要人手工記錄,再把記錄的數(shù)據(jù)輸入計(jì)算機(jī)進(jìn)行相應(yīng)的資料處理.在這個(gè)過(guò)程中,可能由于人為的失誤造成數(shù)據(jù)的錯(cuò)位,導(dǎo)致處理資料的偏差.為了解決便攜式物探儀器與計(jì)算機(jī)數(shù)據(jù)傳輸問(wèn)題,我們?cè)谟?jì)算機(jī)中選擇Visual Basic作為開(kāi)發(fā)工具,下位機(jī)選擇C51做為開(kāi)發(fā)工具.
串口是常用的計(jì)算機(jī)與外部設(shè)備之間的數(shù)據(jù)通道.由于串行通信方便易行,所以應(yīng)用廣泛.依據(jù)不同的條件實(shí)現(xiàn)對(duì)串口的靈活編程控制是我們所需求的.串口九針定義如表1所示.
表1 9針串口定義
Windows下串行通信與以往的DOS下串行通信程序不同的是Windows不提倡應(yīng)用程序直接控制硬件,而是通過(guò)Windows操作系統(tǒng)提供的設(shè)備驅(qū)動(dòng)程序來(lái)進(jìn)行數(shù)據(jù)傳遞.在此結(jié)合實(shí)例,敘述在Visual Basic中實(shí)現(xiàn)PC機(jī)與單片機(jī)串口的通信過(guò)程.
在可視化程序中實(shí)現(xiàn)串口通信,可以利用Windows提供的API函數(shù)通過(guò)查詢方式來(lái)實(shí)現(xiàn),也可以通過(guò)控件以事件的方式來(lái)實(shí)現(xiàn).對(duì)于多數(shù)用戶,控件是最好的選擇.因?yàn)橹灰私馑牟糠謱傩?,通過(guò)在事件中加入合適的處理程序,便可完成對(duì)串口的編程.由于Mscomm控件不是常用的控件,因此需要把該控件添加到工具欄中.在工具欄中右擊鼠標(biāo),在彈出的菜單欄中選擇部件,選中Microsoft Comm Control6.0,便可把Mscomm控件添加到工具欄中,通過(guò)對(duì)Mscomm控件進(jìn)行相應(yīng)的處理便可完成上位機(jī)的串口程序.現(xiàn)把Mscomm控件的常用屬性敘述如表2所示.
表2 Mscomm屬性含義
表3 MSComm的Oncomm事件
以下是通過(guò)設(shè)置控件屬性對(duì)串口進(jìn)行初始化的實(shí)例.
設(shè)置串口端口
MSComm1.CommPort=1
設(shè)置串口通信波特率及相關(guān)參數(shù)
MSComm1.Settings=“9600,n,8,1”
設(shè)置串口通訊模式,0(comInputModeBinary)為二進(jìn)制傳輸,1(comInputModeText)為文本方式傳輸
MSComm1.InputMode=comInputModeBinary
打開(kāi)端口
MSComm1.PortOpen=True
‘打開(kāi)串口’
打開(kāi)對(duì)應(yīng)串口后,需要考慮串口通信的過(guò)程中串口的一些事件.在接收或發(fā)送數(shù)據(jù)過(guò)程中,可能需要監(jiān)視并響應(yīng)一些事件和錯(cuò)誤,所以事件驅(qū)動(dòng)是處理串行端口交互作用的一種非常有效的方法.使用OnComm事件和CommEvent屬性捕獲并檢查通信事件和錯(cuò)誤的值.發(fā)生通信事件或錯(cuò)誤時(shí),將觸發(fā)Oncomm事件,CommEvent屬性的值將被改變,應(yīng)用程序檢查CommEvent屬性值并作出相應(yīng)的反應(yīng)來(lái)完成串口通訊.在Oncomm事件中根據(jù)相應(yīng)的事件添加相應(yīng)的處理程序即可.Oncomm事件(屬性)名稱及對(duì)應(yīng)的關(guān)系如表3所示.
需要說(shuō)明的是,計(jì)算機(jī)和單片機(jī)直接傳輸數(shù)據(jù)需要有數(shù)據(jù)協(xié)議約定,以保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性.協(xié)議約定為每組數(shù)據(jù)前兩字節(jié)為開(kāi)始標(biāo)志,第三字節(jié)為本組數(shù)據(jù)長(zhǎng)度,最后再加上結(jié)束標(biāo)志.以流量?jī)x為例來(lái)論述.
通過(guò)使用微軟的Mscomm控件來(lái)完成計(jì)算機(jī)部分的接收程序和發(fā)送程序.編程簡(jiǎn)單,效率高,通訊準(zhǔn)確性高.發(fā)送部分程序的實(shí)現(xiàn),首先要把發(fā)送部分的數(shù)據(jù)放入發(fā)送隊(duì)列,打開(kāi)串口,對(duì)串口進(jìn)行初始化,設(shè)置相應(yīng)的參數(shù),然后設(shè)置合適Sthreshold參數(shù),把發(fā)送的數(shù)據(jù)寫(xiě)入串口緩沖區(qū),完成發(fā)送任務(wù).接收部分程序的實(shí)現(xiàn),判斷數(shù)據(jù)開(kāi)始標(biāo)志位,把數(shù)據(jù)存入接收隊(duì)列,當(dāng)讀到一組數(shù)據(jù)的結(jié)束標(biāo)志時(shí),數(shù)據(jù)存入相應(yīng)的數(shù)組,為后面計(jì)算做準(zhǔn)備.接收和發(fā)送流程圖如圖1和圖2所示.
圖1 接收流程圖 圖2 發(fā)送流程圖 圖3 下位機(jī)電路原理圖
下位機(jī)是把現(xiàn)場(chǎng)采集到的數(shù)據(jù)存入數(shù)據(jù)存儲(chǔ)器,從現(xiàn)場(chǎng)帶回之后,再把數(shù)據(jù)通過(guò)串口上傳給計(jì)算機(jī),單片機(jī)外接MAX232直接把數(shù)據(jù)上傳給計(jì)算機(jī).MAX232的輸入端T1IN接單片機(jī)的TXD(發(fā)送端),R1OUT接單片機(jī)的RXD(接收端),T1OUT接9針插頭的RXD(接收),R1IN接9針插頭的TXD(發(fā)送),其原理電路圖如圖3所示.這樣就可以完成計(jì)算機(jī)與單片機(jī)通訊的硬件電路搭建.通訊協(xié)議相對(duì)簡(jiǎn)單,所需要的就是把現(xiàn)場(chǎng)采集到的數(shù)據(jù)準(zhǔn)確無(wú)誤的上傳計(jì)算機(jī),協(xié)議開(kāi)始標(biāo)志,EB,4D,中間數(shù)據(jù)位,結(jié)束標(biāo)志0D,0A,因?yàn)閭鬏斁嚯x比較近,所以沒(méi)有加校驗(yàn)位.計(jì)算機(jī)開(kāi)始接收數(shù)據(jù)之前,發(fā)送一組開(kāi)始數(shù)據(jù)傳輸標(biāo)志,然后下位機(jī)把數(shù)據(jù)存貯器中的數(shù)據(jù)按通訊協(xié)議的方式上傳計(jì)算機(jī),完成數(shù)據(jù)的通訊.我們已經(jīng)將此應(yīng)用到便攜式磁電流量?jī)x、礦業(yè)直流電法儀、礦用水壓自動(dòng)記錄儀、礦用測(cè)井儀等物探儀器中,取得了很好的應(yīng)用效果.
詳細(xì)論述了串口編程的原理、方法、以及如何實(shí)現(xiàn),給出了上位機(jī)(計(jì)算機(jī))、下位機(jī)(單片機(jī))部分的程序流程圖,電路原理圖.以及串口控件如何使用,如何快速的完成程序設(shè)計(jì).對(duì)串口進(jìn)行操作大大提高了編程的效率,使監(jiān)測(cè)與監(jiān)控實(shí)現(xiàn)變得不那么復(fù)雜.同時(shí)給出了在物探儀器中的典型應(yīng)用,把現(xiàn)場(chǎng)采集的數(shù)據(jù)準(zhǔn)確、高速的上傳給計(jì)算機(jī),為工程技術(shù)人員進(jìn)行資料處理提供了可靠的依據(jù).大大的提高了工作效率,減少了抄錄數(shù)據(jù)的錯(cuò)誤,為工程技術(shù)人員節(jié)約了更多的時(shí)間來(lái)分析資料,提出可靠的預(yù)防措施,受到現(xiàn)場(chǎng)工程技術(shù)人員的一致好評(píng).
參考文獻(xiàn)
[1] 李現(xiàn)勇.VisualC++串口通信技術(shù)與工程實(shí)踐[M].北京:人民郵電出版社,2002.
[2] 凌志浩.智能儀表原理與設(shè)計(jì)技術(shù)[M].上海:華東理工大學(xué)出版社,2003.
[3] 秋育橋.基于MSComm的PC機(jī)與單片機(jī)串行通信程序設(shè)計(jì)[J].科技信息,2009,(2):76-79.
[4] 岳志高.MSComm控件在VC++6.0串口通信中的應(yīng)用[J].長(zhǎng)春工程學(xué)院學(xué)報(bào),2009,(1): 51-54.
[5] 張自強(qiáng).基于VC++MSCcomm控件的串行通信[J].河南科技大學(xué)學(xué)報(bào),2004,(1):33-40.