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