摘要:本文介紹了RS232通信的基本概念以及常用通信技術(shù)。常用通信連線的管腳介紹及連線方法。VB通信控件MSComm控件的使用及常見使用時(shí)的問題及解決方法。
關(guān)鍵詞:RS232技術(shù)MSComm控件的使用
1 概述
通信技術(shù)是現(xiàn)代數(shù)據(jù)傳輸過程中不可缺少的重要內(nèi)容,無論是日常生活,還是現(xiàn)代工業(yè)生產(chǎn),計(jì)算機(jī)通信越來越為人們所熟知。例如無線通信技術(shù),工廠上位機(jī)與下位機(jī)的MES通信等等。它在節(jié)能、保密、自動、快速、提高功效等方面也起到了相當(dāng)大的作用。本文主要介紹了常用的串口通信232技術(shù)和VB應(yīng)用串口通信控件技術(shù)及注意事項(xiàng)。
2 串口通信的協(xié)議
串口通信接口的標(biāo)準(zhǔn)有很多種,基本上都是在RS-232標(biāo)準(zhǔn)的基礎(chǔ)上進(jìn)行創(chuàng)新形成的,所以,本文主要討論的是RS-232-C。RS-232C標(biāo)準(zhǔn)是在1969年由美國ETA與BELL等公司聯(lián)合開發(fā)的通信協(xié)議。它主要適用于數(shù)據(jù)傳輸速率在0~20000b/s范圍內(nèi)的通信,對串行通信接口的很多方面都做出了明確規(guī)定。目前市場上出現(xiàn)了很多能夠與該標(biāo)準(zhǔn)兼容的通信設(shè)備,該標(biāo)準(zhǔn)已經(jīng)得到了廣泛的應(yīng)用。
2.1 電氣特性 EIA-RS-232-C規(guī)定了電氣特性、各種信號線功能等。
在TxD和RxD上:邏輯1(MARK)=-3V~-15V
邏輯0(SPACE)=+3~+15V
在RTS、CTS、DSR、DTR和DCD等控制線上:
信號有效(接通,ON狀態(tài),正電壓)=+3~+15V
信號有效(斷開,ON狀態(tài),負(fù)電壓)=-3V~-15V
2.2 連接器的機(jī)械特性 連接器:由于RS-232C并未定義連接器的物理特性,因此,出現(xiàn)了DB-25、DB-15和DB-9各種烈性的連接器,其引腳的定義也各不相同。
2.3RS-232C的接口信號 比較常用的接口信號有9條,分別是:
①聯(lián)絡(luò)控制信號線:數(shù)據(jù)裝置準(zhǔn)備好(Datasetready-DSR)——有效時(shí)(on)狀態(tài),說明現(xiàn)在可以使用MODOM。數(shù)據(jù)終端準(zhǔn)備好(Dataterminalready-DTR)——有效時(shí)(on)狀態(tài),說明現(xiàn)在可以使用數(shù)據(jù)終端。請求發(fā)送(Requesttosend-RTS)——說明DTE(數(shù)據(jù)終端設(shè)備)需要DCE(數(shù)據(jù)通信設(shè)備)提供數(shù)據(jù)。允許發(fā)送(Cleartosend-CTS)——它是對發(fā)送數(shù)據(jù)和請求發(fā)送信號RTs的響應(yīng)信號,該信號說明MODOM已經(jīng)準(zhǔn)備好了接收終端數(shù)據(jù),DCE(數(shù)據(jù)通信設(shè)備)可以向DTE(數(shù)據(jù)終端設(shè)備)輸送數(shù)據(jù)了。連接線信號檢出(RLSD)——說明DCE已接通通信鏈路,DTE可以準(zhǔn)備接收數(shù)據(jù)了,當(dāng)本地的MODEM收到由通信鏈路另一端(遠(yuǎn)地)的MODOM送來的載波信號時(shí),使RLSD信號有效,通知終端準(zhǔn)備接收,并且由MODEM將接收下來的載波信號解調(diào)成數(shù)字?jǐn)?shù)據(jù)后,沿接收數(shù)據(jù)線RxD送到終端。此線也叫做數(shù)據(jù)載波檢出(DataCarrierdectection-DCD)線。
振鈴指示(Ringing-RI)——當(dāng)MODEM收到交換臺送來的振鈴呼叫信號時(shí),使該信號有效(ON狀態(tài)),通知終端,已被呼叫。
②數(shù)據(jù)發(fā)送與接收線:發(fā)送數(shù)據(jù)(Transmitteddata-TxD)——通過TxD終端將串行數(shù)據(jù)發(fā)送到MODEM,(DTE→DCE)。接收數(shù)據(jù)(Receiveddata-RxD)——通過RxD終端接收從MODEM發(fā)來的串行數(shù)據(jù),(DCE→DTE)。
③地線:SG——保護(hù)地信號線,無方向。
3 通信方式
3.1 遠(yuǎn)距離通信 遠(yuǎn)距離通信是指傳輸距離大于15m的通信,通常會使用調(diào)制解調(diào)器MODEM,所以可供選擇的信號線是很多的。
3.2 近距離通信零Modem的最簡連接(3線制) 如果通信距離比較近,就不需要Modem,只需要直接連接通信雙方就可以了。甚至有時(shí)不需要RS-232C的控制聯(lián)絡(luò)信號,只連接發(fā)送線、接收線、信號地線就可以實(shí)現(xiàn)通信。
4 Visual Basic MSComm控件介紹
該控件是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它能夠?yàn)閼?yīng)用程序提供通過串行接口收發(fā)數(shù)據(jù)的簡便方法。
MSComm控件處理通訊的方式有事件驅(qū)動方式和查詢方式兩種。
MSComm 控件的常用屬性
■
5 MSComm控件常見使用問題及解決方法
5.1 MSComm控件中“文本格式”的缺陷
本人在VB與儀表的串口通訊軟件操作中發(fā)現(xiàn),儀表的數(shù)據(jù)格式是ASCII文本格式的,因此在以往編寫VB代碼的過程中,一直也是文本方式接收的。直到最近,一個項(xiàng)目中需要使用十六進(jìn)制數(shù)據(jù)通訊,方才發(fā)現(xiàn),MSComm空間在接收文本時(shí)存在的問題。
Dim i
For i=0 to 255
Mscomm1.output=chr(i)
Next i
起初,我仍用文本方式接收下位機(jī)傳來的數(shù)據(jù),收到后用(ASC)函數(shù)轉(zhuǎn)為數(shù)據(jù)字節(jié)。按說這種方式也是可以的,但是,通訊后查看數(shù)據(jù)長度時(shí)才發(fā)現(xiàn),很多字節(jié)丟失了!這是怎么回事?經(jīng)過反復(fù)調(diào)試,終于發(fā)現(xiàn),被丟掉的字節(jié),是某些特定的字符。比如當(dāng)數(shù)據(jù)是FF時(shí),能夠接受,當(dāng)數(shù)據(jù)是D9時(shí),就無論如何都收不到,MSComm會丟棄這個字節(jié),等到下個“有效”字節(jié)接收到時(shí)才觸發(fā)中斷。原來,MSComm控件在接收字符時(shí)有個“認(rèn)生”的毛病,如果以字符方式接收數(shù)據(jù),收到“字符”后MSComm會嘗試對其進(jìn)行識別。后來發(fā)現(xiàn)對于大于128的字符,在文本接受模式下,這個字節(jié)被當(dāng)作了ASCII碼對應(yīng)的字符是MSComm不認(rèn)識的。
針對這種情況,我在接收數(shù)據(jù)時(shí),將MSCommINputMode的值設(shè)定為“comInputModeBinary”。此時(shí),MSComm將轉(zhuǎn)為二進(jìn)制接收狀態(tài),不再試圖將接收數(shù)據(jù)辨識為字符。經(jīng)測試,在二進(jìn)制接收條件下,MSComm可以接收到所有數(shù)據(jù),不會再有丟失數(shù)據(jù)現(xiàn)象,將接收到的二進(jìn)制字符按字節(jié)轉(zhuǎn)換成十六進(jìn)制,即可獲取通訊輸入的數(shù)據(jù)。
Dim a1(255) as Byte
For i=0 to 255
chr(i)=i
Next i
Mscomm1.output=a1(i)
Do
DoEvents
Loop until mscomm1. OutBufferCount=0
接收過程
Mscomm1_OnComm()
Select case ComEvReceive
Dim buffer as variant,i
Mscomm1.Inputmode=ComInputModeBinary
Mscomm1.InputLen=0
Buffer=Mscomm.Input
For i=LBound(buffer) to UBound(buffer)
Debug.pint=buffer(i)
Next i
Case
造成這種結(jié)果的原因在于中文WINDOW的操作系統(tǒng)使用雙字節(jié)字符系統(tǒng)(DBCS)。DBCS系統(tǒng)使用0-128之間的數(shù)字代表字符,大于128的字符代表前導(dǎo)字符,不代表實(shí)際意義,它只是顯示非拉丁語系的字符。
5.2 如何發(fā)送0字符(00H,NULL)
在Mscomm 控件屬性NulDiscard=1
使用二進(jìn)制接收即Mscomm1.Inputmode=ComInputModeBinary
5.3 小技巧
很多技術(shù)文獻(xiàn)中要求用戶先設(shè)定”comInputModeBinary”,再打開串口。實(shí)際上,通訊過程中,VB允許在打開串口的情況下修改接收數(shù)據(jù)方式,且修改會立即生效,不必重新開關(guān)串口。我們只要保證不在接收數(shù)據(jù)中途修改這個參數(shù)就可以了。
6 結(jié)束語
就目前國內(nèi)的通信而言,RS232技術(shù)雖然很成熟,且有被網(wǎng)絡(luò)技術(shù)取代的趨勢,但是RS232串口通信還是被大量的使用,因此熟悉并掌握它的原理及技術(shù)對于我們今后維護(hù)和開發(fā)新技術(shù)會有很好的參考作用。
參考文獻(xiàn):
[1]黃志峰編著.Visual Basic高級編程實(shí)例精解[M].北京:國防工業(yè)出版社,2001.
[2]孫秀梅等編著.Visual Basic開發(fā)實(shí)戰(zhàn)1200例[M].北京:清華大學(xué)出版社,2011.
[3]郭天祥編著.51單片機(jī)C語言教程[M].北京:電子工業(yè)出版社,2009.