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