程巍巍
提要本文介紹了基于VB6.0的MSComm通信控件相關(guān)理論,并以一個實例演示了MSComm控件的主要屬性。
關(guān)鍵詞:串行通信;VB6.0;MSComm控件
中圖分類號:F49文獻(xiàn)標(biāo)識碼:A
在當(dāng)今這個科技飛速發(fā)展的時代,我們經(jīng)常需要在計算機(jī)與其他設(shè)備之間進(jìn)行通信,而串行通信作為一種靈活、方便、可靠的通信方式被廣泛采用。在開發(fā)串行通信程序的過程中,利用微軟的MSComm通信控件相對比較簡單,該控件具有豐富的與串行通信密切相關(guān)的屬性及事件,提供了對串口的各種操作。MSComm控件在VB中容易使用,在串口編程時也非常方便,程序員不必花時間去了解較為復(fù)雜的API函數(shù)。
一、用VB6.0進(jìn)行串行通信程序的設(shè)計方法簡介
用visual basic6.0進(jìn)行串行通信程序的設(shè)計有兩種方式:(1)直接調(diào)用Windows API。(2)使用通信組件。該方式實際上是通過通信組件間接調(diào)用Windows API函數(shù),其過程要比直接調(diào)用API要復(fù)雜,但在程序上容易實現(xiàn)。使用MSComm控件時,實際上就是使用了API函數(shù),API函數(shù)將被Comm.drv解釋并傳送給外圍設(shè)備驅(qū)動程序,使用MSComm的用戶只需要關(guān)心如何使用MSComm所提供的屬性或事件,以驅(qū)動API函數(shù)的接口完成工作。
二、串行通信程序的執(zhí)行過程
MSComm控件通過串行端口傳輸和接收數(shù)據(jù),為應(yīng)用程序提供串行通信功能。該控件提供了兩種處理通信的方式:
1、事件驅(qū)動通信。事件驅(qū)動通信是處理串行端口交互作用的一種非常有效的方式。在使用事件驅(qū)動通信時,每當(dāng)有一個字符到達(dá)或端口狀態(tài)發(fā)生改變,或發(fā)生錯誤時,MSComm控件將觸發(fā)OnComm事件進(jìn)行捕獲,通過檢查MSComm控件的CommEvent屬性獲知所發(fā)生的事件或錯誤,從而采取相應(yīng)的操作處理這些通信事件。這種方法的優(yōu)點是程序響應(yīng)及時,可靠性高。
2、查詢法。該方法可以在程序的每個關(guān)鍵功能之后,通過檢查CommEvent屬性的值來查詢事件和錯誤。每個使用的MSComm控件對應(yīng)著一個串行端口。如果應(yīng)用程序需要訪問多個串行端口,必須使用多個MSComm控件。
查詢法適合于較小的應(yīng)用程序,在這種情況下,每當(dāng)應(yīng)用程序執(zhí)行完某一串行口操作后,將不斷檢查MSComm控件的CommEvent屬性,以檢查執(zhí)行結(jié)果或檢查某一事件是否發(fā)生。
而進(jìn)行串行通信時一般有兩種傳輸方式:
(1)字符形式:通常以小于ASCII碼128的字符碼來傳遞,通常用于傳送指令。
(2)二進(jìn)制形式:將數(shù)據(jù)以二進(jìn)制編碼的方式傳遞,它可能含有ASCII碼128以上的字符碼。通常用來傳送數(shù)據(jù),以提高速度。
三、串行通信實例
下面以一個實例來演示MSComm控件的主要屬性。根據(jù)程序需要,進(jìn)行以下操作步驟:
1、新建工程。啟動VB后,新建一個標(biāo)準(zhǔn)的EXE工程。
2、設(shè)計用戶界面。(1)在“工具”菜單中選中“部件”,在“控件”選項卡中選擇“Microsoft Comm Controls6.0”。然后從工具箱中將MSComm添加到窗體Form1中。(2)給窗體Form1添加1個計時器控件,3個命令按鈕控件,并設(shè)置控件的相關(guān)屬性。(表1)
3、編寫程序代碼
Option Explicit
Public echo As Boolean'回應(yīng)‘打開/關(guān)閉標(biāo)志
Dim ret As Integer'設(shè)為整數(shù)
Dim starttime As Data'為端口計時器存儲開始時間
Private Sub command1_click()
On Error Resume Next
Dim openflag
MSComm1.PortOpen = Not MSComm1.PortOpen
If Err Then MsgBox Error$,48
openflag = MSComm1.PortOpen
If MSComm1.PortOpen Then
starttiming
End If
End Sub
Private Sub Command2_Click()
On Local Error Resume Next
Static num As String
num="1-029-8936-6735"'MSDN的電話號碼'從用戶處獲得電話號碼
num=InputBox$("輸入電話號碼:","撥打電話號碼",num)
If num="" Then Exit Sub
If Not MSComm1.PortOpen Then'如果端口沒有打開則打開它
If Err Then Exit Sub
End If
MSComm1.Output="ATDT" & num & vbCrLf'撥打電話號碼
starttiming'啟動端口計時器
End Sub
Private Sub Command3_Click()
On Error Resume Next
MSComm1.Output="ATH"'發(fā)送掛機(jī)字符串
ret=MSComm1.DTREnable'保存當(dāng)前設(shè)置
MSComm1.DTREnable=True'打開DTR
MSComm1.DTREnable=False'關(guān)閉DTR
MSComm1.DTREnable=ret'恢復(fù)原來的設(shè)置'如果端口確實處于打開狀態(tài),則關(guān)閉它
If MSComm1.PortOpen Then MSComm1.PortOpen = False
If Err Then MsgBox Error$,48'通知用戶錯誤信息
stoptiming'停止端口計時器
On Error GoTo 0
End Sub
'oncomm事件被用于捕獲communications事件及錯誤
Private Static Sub MSComm1_OnComm()
Dim evmsg$
Dim ermsg$
'依據(jù)commecent屬性進(jìn)行分支
Select Case MSComm1.CommEvent
'事件信息
Case comEvReceive
Dim buffer As Variant
buffer = MSComm1.Input
Debug.Print "接收-" & StrConv(buffer,vbUnicode)
'showdate txtterm,(StrConv(buffer,vbUnicode))
Case comEvSend
Case comEvCTS
evmsg$="被檢測的CTS改變"
Case comEvDSR
evmsg$="被檢測的DSR改變"
Case comEvCD
evmsg$="被檢測的CD改變"
Case comEvRing
evmsg$="電話鈴響起"
Case comEvEOF
evmsg$="被檢測的文件結(jié)尾"
Case comBreak
ermsg$="收到中斷"
Case comCDTO
ermsg$="運(yùn)輸檢測超時"
Case comCTSTO
ermsg$="CTS超時"
Case comDCB
ermsg$="檢索DCB錯誤"
Case comDSRTO
ermsg$="DSR超時"
Case comFrame
ermsg$="幀錯誤"
Case comOverrun
ermsg$="超限錯誤"
Case comRxOver
ermsg$="接收緩沖區(qū)溢出"
Case comRxParity
ermsg$="奇偶校驗錯"
Case comTxFull
ermsg$="傳送緩沖區(qū)滿"
Case Else
ermsg$="未知的錯誤或事件"
End Select
End Sub
Private Sub starttiming()
'調(diào)用此函數(shù)啟動連接時間計時器
starttime=Now
Timer1.Enabled=True
End Sub
Private Sub stoptiming()
'調(diào)用此函數(shù)停止計時
Timer1.Enabled = False
End Sub
程序執(zhí)行時的界面如下圖:
(作者單位:西安歐亞學(xué)院信息工程學(xué)院)