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










