龔建偉評論:本文對在VB4.0中使用ActiveX控件MSComm進行串口編程,給出了一個實例,因我不懂VB,無法評論其實用性,但經常有網友問及VB的串口編程,故我也放在這里,讀者自已去看吧。
摘要:Visual Basic4.0 中通信控件及其在bbbbbbs平臺下的通信軟件設計方法,并結合具體實例給出了基本的通信程序。
關鍵詞:Visual Basic MSCOMM.VBX通信控件 程序設計
1992年Crescent Software Inc.公司專為VB設計了MSCOMM.VBX用戶通信控件,它提供了通過串口發(fā)送和接收數據的串行通信能力,不但包括了全部bbbbbbs API中關于串行通信的16個函數所完成的功能,而且開拓了更多的使用戶設計方便的對象屬性來滿足不同用戶不同業(yè)務的需求。目前國內眾多的VB資料中很少涉及該通信控件的介紹,本文將詳細介紹MSCOMM.VBX通信控件及編程方法,并結合工作中的一個實例給出基本通信程序。
1 MSCOMM.VBX通信控件描述
MSCOMM.VBX通信控件可直接從VB的ToolBox中加入窗體bbbb,即可用其進行通信。若ToolBox中無此控件,則用Tools的Custom Controls 將MSCOMM.VBX從bbbbbbs的System子目錄中加入VB的ToolBox中。
1.1 通信方式
MSCOMM.VBX有2種不同的方式來處理和解決各類通信軟件的開發(fā)和設計問題
1、事件驅動。它與C/C++寫bbbbbbs 軟件時的窗口回調函數類似,是1種功能強大的處理問題的方法。在實際工作中,往往要處理許多通信中的相關事件,例如:當線路數據到達本端或CD線和RTS信號線狀態(tài)發(fā)生變化時,要求我們使用相應的事件來跟蹤和處理,該控件是使用OnComm事件來實現(xiàn)的,它也包括檢測和處理通信錯誤等方面的問題,CommEvent 值返回最近的通信事件或錯誤的數字代碼。通信控件詳細的錯誤和事件舉例有:
MSCOMM-ER-BREAK 收到1個Break Signal
MSCOMM-ER-CDTO CD 信號超時
……
MSCOMM-EV-CD CD信號改變
……
2、查詢方式。由程序設計者負責讀取CommEvent的值并處理所發(fā)生的錯誤或事件。通常簡單的應用程序設計可采用這種辦法。
1.2 通信控件的屬性
利用通信控件編制通信程序,關鍵是準確理解設置通信控件的屬性。MSCOMM.VBX提供了27個關于通信控件方面的屬性,例如:
CommPort:設置或返回通信口編號。
Settings:設置或返回以字符串形式出現(xiàn)的數據通信格式:波特率、校驗、數據位和停 止位。
PortOpen:設置或返回通信口狀態(tài)(包括打開和關閉1個通信口)
……
3、 實例
本程序應用背景為DCC95型靜電除塵器自動監(jiān)控系統(tǒng)軟件,解決1個PC工控機(主站)與32個單片機(子站)之間的通信問題。主站與子站之間這總線式網絡結構,采用RS-485通信標準,以問答方式進行數據通信。由于32個子站與主站發(fā)送通信命令(下行命令),主站在接收子站發(fā)回的相應回答命令(上行命令)后繼續(xù)發(fā)送下行命令的通信形式。根據系統(tǒng)功能的要求,主站需發(fā)送2種類型的命令:(1)同期命令,它由定時器觸發(fā)引起,每隔ls周期發(fā)送1次;(2)非周期性命令,它由操作者按動相應命令按鈕引起,非周期性發(fā)送。自動監(jiān)控系統(tǒng)軟件安裝在主站上,而通信程序作為自動監(jiān)控系統(tǒng)軟件的一部分也安裝在主站上。
本文僅列出調試通信程序時進行試驗用的基本演示程序清單。試驗時,用1臺PC機作為主站,另一臺PC機模擬32個子站的工作,兩臺PC機之間采用RS232c串口通信。往主站的通信演示程序窗體(bbbb)中加入1個通信控件、2個定時器控件和1個命令按鈕控件,通信控件(Mscomm1)用于訪問串口,發(fā)送和接收數據;Periodic定時器控件(Periodic)用于控制每秒由主站向各子站發(fā)送周期性命令;命令按鈕控件(NonPeriodic-Command)與NonPeriodic定時器控件(NonPeriodic)用于發(fā)送非周期性命令。數據傳送采用事件驅動的通信方式,根據不同的發(fā)送命令設置RTreshlod屬性,從而引起OnComm事件以接收數據。
2.1 窗體各控件初始化程序
設置通信串口工作參數,設置Periodic定時器的在斷間隔為ls, NonPeriodic定時器的中斷間隔為0.5s。
Sub bbbb-Load ()
Mscomm1.CommPort=2 ’選用COM2串行口
Mscomm1.Settings="9600,N8,1" ’波特率9600,無奇偶校驗位,8位數據位1位停止位
Mscomm1.bbbbbLen=0 ’bbbbb將讀取接收緩沖區(qū)的全部內容
Mscomm1.InBufferSize=1024 ’設置接收緩沖區(qū)的字節(jié)長度
Mscomm1.PortOpen=True ’打開通信口
Mscomm1.InBufferCount=0 ’清除發(fā)送緩沖區(qū)數據
Mscomm1.OutBufferCount=0 ’清除接收緩沖區(qū)數據
Periodic.intbbbb=100 ’設置ls定時間隔,使遙測命令每隔ls發(fā)送1次
NonPeriodic.intbbbb=500 ’設置0.5s定時間隔,查詢命令按鈕是否處于激活狀態(tài)以確定是否發(fā)送周期性命令
Command-Pressed=False ’命令按鈕為未激活狀態(tài)
During- Periodic=False ’周期性命令數據傳輸尚未開始
During- NonPeriodic=False ’非周期性命令數據傳輸尚未開始
End Sub
2.2 非周期性命令發(fā)送程序
根據命令按鈕狀態(tài)及周期性命令數據傳輸狀態(tài),在NonPeriodic定時器的中斷程序中發(fā)送非周期性命令。
Sub NonPeriodic-Command-Click ()
Command-Pressed=True ’命令按鈕激活
End Sub
Sub NonPeriodic-Timer ()
if During- Periodic=True OR Command-Pressed=False
Then Exit Sub ’若周期性命令數據傳輸尚未結束或命令按鈕處于激活狀態(tài),則退出發(fā)送非周期性命令程序。
Command-Pressed=False ’命令按鈕恢復為未激活狀態(tài)
Call SendData (NONPERIODIC-COMMAND) ’發(fā)送非周期性命令
[NextPage]
Mscomm1.RThreshold=R-NONPERIODIC-BYTE’發(fā)送非周期性命令后,設置Rthreshold屬性,使主站接收所設定的字節(jié)數后引發(fā)OnComm事件
End Sub
2.3 Periodic定時器程序
在Periodic定時器的中斷程序中發(fā)送周期性命令:
Sub Periodic-Timer ()
if During- NonPeriodic=True Then Exit Sub ’若非周期性命令數據傳輸尚未結束,則退出發(fā)送非周期性命令程序。
During-Periodic=True ’設置周期性命令數據傳輸狀態(tài)為正在進行中
Call SendData (PERIODIC-COMMAND) ’發(fā)送周期性命令
Mscomm1.RThreshold=R-PERIODIC-BYTE ’發(fā)送周期性命令后,主站接收R-REMOT- EDATA-BYTE個字節(jié),可引發(fā)OnComm 事件
End Sub
2.4 OnComm事件程序
根據RThreshold屬性設置值,當接收緩存區(qū)內接收到相應字節(jié)的字符時,引發(fā)OnComm事件,在中斷程序中接收數據。
Sub Mscomm1-OnComm ()
Select Case Mscomm1.CommEvent ’在此可插入處理各種不同錯誤或事件的代碼
Case MSCOMM-EV-RECEIVE
Receivebbbbbb$=Mscomm1.bbbbb
Select Case Mscomm1.RThreshold
Case R-PERIODIC-BYTE ’周期性命令的應答數據
Call DisposeData(PERIODIC-COMMAND) ’處理接收數據
During Periodic=False ’設置周期性命令數據傳輸狀態(tài)為結束
Case R-NONPERIODIC-BYTE ’非周期性命令的應答數據
Call DisposeData(NONPERIODIC-COMMAND) ’處理接收數據
During-Nonperiodic=False ’設置非周期性命令數據傳輸狀態(tài)為結束
End Select
End Select
End Sub
隨著VB版本的不斷升級,VB將成為最快速、易用、強勁的應用開發(fā)工具,是企業(yè)級客戶/服務器應用軟件開發(fā)的首選工具之一。
參考文獻
1、夏云 ·bbbbbbs環(huán)境下串行數據通信程序設計·PC應用,1995;(6)
2、舒繼武·Visual Basic 3.0中通信及應用·微型機與應用,1996;(8)
3、陳小歐·bbbbbbs環(huán)境下串口異步通信程序設計·電子技術應用,1997;(2)










