安明浩 石磊
摘 要:使用VB6.0中的MSComm通信控件的屬性和事件進(jìn)行編程操作,實(shí)現(xiàn)上位機(jī)與儀器的RS232C串口通信。
關(guān)鍵詞:MSComm控件;實(shí)現(xiàn);串口通信
1 程序要求
現(xiàn)有檢測(cè)儀器一臺(tái),使用RS232C串口與計(jì)算機(jī)進(jìn)行通信。該儀器輸出為RS-232C標(biāo)準(zhǔn)接口,波特率為300~9600,無(wú)奇偶校驗(yàn),8個(gè)數(shù)據(jù)位,1個(gè)停止位。所有命令均發(fā)送8位16進(jìn)制數(shù)值。儀器在按下“檢測(cè)開(kāi)始”按鈕后,不需要計(jì)算機(jī)進(jìn)行任何操作,會(huì)主動(dòng)發(fā)送代表儀器當(dāng)前狀態(tài)及檢測(cè)數(shù)值的8位16進(jìn)制數(shù),要求上位機(jī)通過(guò)RS232C串口與儀器進(jìn)行通信,提示用戶(hù)當(dāng)前的儀器工作狀態(tài)并將檢測(cè)的結(jié)果數(shù)值顯示在上位機(jī)上。
儀器RS232C通信協(xié)議。
例:
延時(shí)發(fā)送[機(jī)器碼][命令號(hào)0x33][延時(shí)命令高0x00][延時(shí)命令低0x01][延時(shí)時(shí)間高8位][延時(shí)時(shí)間低8位][CRC校驗(yàn)低8位][CRC校驗(yàn)高8位]
機(jī)器碼:0x11
編寫(xiě)VB6.0程序來(lái)訪(fǎng)問(wèn)串口,讀取檢測(cè)儀器上顯示的狀態(tài)及數(shù)據(jù)。
2 程序編寫(xiě)
(1)首先進(jìn)行VB6.0通信控件的添加。在VB6.0的“工程”菜單下面選擇“部件”子菜單,在控件欄中勾選“Microsoft comm control6.0”就可以在工具箱里面看到該件,將該控件添加到窗體上即可。
(2)在測(cè)試窗體上添加一通信控件命名為“MSComm1”,并在窗體的Load事件中設(shè)置串口并開(kāi)啟串口。
With MSComm1
.CommPort = 1
.Settings=”9600,N,8,1”
.InputMode= comInputModeBinary‘設(shè)置接受數(shù)據(jù)的類(lèi)型是二進(jìn)制類(lèi)型數(shù)據(jù)
.InputLen=0 ‘讀取接收緩沖區(qū)中全部的內(nèi)容
.InBufferCount=0 ‘清空接收緩沖區(qū)
.OutBufferCount=0 ‘清空發(fā)送緩沖區(qū)
.SThreshold=0 ‘一旦發(fā)送數(shù)據(jù)就觸發(fā)OnComm()事件來(lái)檢測(cè)是否返回?cái)?shù)據(jù)
.RThreshold=1 ‘接收到1個(gè)字節(jié)數(shù)據(jù)就立即觸發(fā)OnComm()事件
.CommPort=1 ‘使用第一個(gè)串口
.PortOpen=True ‘打開(kāi)串口
End With
需要注意的是,要在使用完串口后將其釋放,所以在窗體的Unload事件中將串口資源釋放。
With MSComm1
.PortOpen = False
End With
(3)雙擊窗體上的MSComm1控件,進(jìn)入控件的MSComm1_OnComm事件,并添加下列代碼。
Private Sub MSComm1_OnComm() 定義接收16進(jìn)制數(shù)值的數(shù)組
Dim Receiveing()As Byte,Received(20)As Byte
Dim Lenth As Integer,i As Integer‘定義中間變量
Static n As Long
If MSComm1.CommEvent = comEvReceive Then ‘儀器有應(yīng)答
Receiveing = MSComm1.Input ‘讀取報(bào)文
Lenth = UBound(Receiveing) ‘收到lenth個(gè)字符
For i = 0 To Lenth
Received(n + i)= Receiveing(i)‘將后續(xù)讀到的報(bào)文疊加到數(shù)組中
Next i
n = n + Lenth + 1 ‘計(jì)算總長(zhǎng)度
If n >= 8 Then ‘收到了全部的報(bào)文
RecievieData = 1 ‘接收?qǐng)?bào)文長(zhǎng)度正確標(biāo)記位
XvgData = Received ‘存放接收的報(bào)文
End if
End if
End sub
上述添加的代碼用于讀取從儀器發(fā)來(lái)的二進(jìn)制數(shù)值,并存儲(chǔ)到XvgData 數(shù)組中,等待使用。
3 結(jié)束語(yǔ)
以上程序?yàn)檎f(shuō)明VB6.0利用MSComm控件的通信過(guò)程,僅給出了通信部分的程序,其他部分,如CRC校驗(yàn)、狀態(tài)如何顯示、數(shù)值如何處理及存儲(chǔ)部分因?yàn)椴皇且f(shuō)明的主要部分所以未做進(jìn)一步的說(shuō)明。
利用VB6.0的MSComm控件可以快速開(kāi)發(fā)出串口通信程序,從而大大提高編程的效率。
參考文獻(xiàn)
[1]范逸之,陳立元.Visual Basic與RS-232串行通信控制[M].中國(guó)青年出版社,2002.
(作者單位:加野麥克斯儀器(沈陽(yáng))有限公司)