VB6.0的MSComm通信控件应用举例
2009-03-27程巍巍
程巍巍
提要本文介绍了基于VB6.0的MSComm通信控件相关理论,并以一个实例演示了MSComm控件的主要属性。
关键词:串行通信;VB6.0;MSComm控件
中图分类号:F49文献标识码:A
在当今这个科技飞速发展的时代,我们经常需要在计算机与其他设备之间进行通信,而串行通信作为一种灵活、方便、可靠的通信方式被广泛采用。在开发串行通信程序的过程中,利用微软的MSComm通信控件相对比较简单,该控件具有丰富的与串行通信密切相关的属性及事件,提供了对串口的各种操作。MSComm控件在VB中容易使用,在串口编程时也非常方便,程序员不必花时间去了解较为复杂的API函数。
一、用VB6.0进行串行通信程序的设计方法简介
用visual basic6.0进行串行通信程序的设计有两种方式:(1)直接调用Windows API。(2)使用通信组件。该方式实际上是通过通信组件间接调用Windows API函数,其过程要比直接调用API要复杂,但在程序上容易实现。使用MSComm控件时,实际上就是使用了API函数,API函数将被Comm.drv解释并传送给外围设备驱动程序,使用MSComm的用户只需要关心如何使用MSComm所提供的属性或事件,以驱动API函数的接口完成工作。
二、串行通信程序的执行过程
MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通信功能。该控件提供了两种处理通信的方式:
1、事件驱动通信。事件驱动通信是处理串行端口交互作用的一种非常有效的方式。在使用事件驱动通信时,每当有一个字符到达或端口状态发生改变,或发生错误时,MSComm控件将触发OnComm事件进行捕获,通过检查MSComm控件的CommEvent属性获知所发生的事件或错误,从而采取相应的操作处理这些通信事件。这种方法的优点是程序响应及时,可靠性高。
2、查询法。该方法可以在程序的每个关键功能之后,通过检查CommEvent属性的值来查询事件和错误。每个使用的MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。
查询法适合于较小的应用程序,在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性,以检查执行结果或检查某一事件是否发生。
而进行串行通信时一般有两种传输方式:
(1)字符形式:通常以小于ASCII码128的字符码来传递,通常用于传送指令。
(2)二进制形式:将数据以二进制编码的方式传递,它可能含有ASCII码128以上的字符码。通常用来传送数据,以提高速度。
三、串行通信实例
下面以一个实例来演示MSComm控件的主要属性。根据程序需要,进行以下操作步骤:
1、新建工程。启动VB后,新建一个标准的EXE工程。
2、设计用户界面。(1)在“工具”菜单中选中“部件”,在“控件”选项卡中选择“Microsoft Comm Controls6.0”。然后从工具箱中将MSComm添加到窗体Form1中。(2)给窗体Form1添加1个计时器控件,3个命令按钮控件,并设置控件的相关属性。(表1)
3、编写程序代码
Option Explicit
Public echo As Boolean'回应‘打开/关闭标志
Dim ret As Integer'设为整数
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"'发送挂机字符串
ret=MSComm1.DTREnable'保存当前设置
MSComm1.DTREnable=True'打开DTR
MSComm1.DTREnable=False'关闭DTR
MSComm1.DTREnable=ret'恢复原来的设置'如果端口确实处于打开状态,则关闭它
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$
'依据commecent属性进行分支
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$="被检测的文件结尾"
Case comBreak
ermsg$="收到中断"
Case comCDTO
ermsg$="运输检测超时"
Case comCTSTO
ermsg$="CTS超时"
Case comDCB
ermsg$="检索DCB错误"
Case comDSRTO
ermsg$="DSR超时"
Case comFrame
ermsg$="帧错误"
Case comOverrun
ermsg$="超限错误"
Case comRxOver
ermsg$="接收缓冲区溢出"
Case comRxParity
ermsg$="奇偶校验错"
Case comTxFull
ermsg$="传送缓冲区满"
Case Else
ermsg$="未知的错误或事件"
End Select
End Sub
Private Sub starttiming()
'调用此函数启动连接时间计时器
starttime=Now
Timer1.Enabled=True
End Sub
Private Sub stoptiming()
'调用此函数停止计时
Timer1.Enabled = False
End Sub
程序执行时的界面如下图:
(作者单位:西安欧亚学院信息工程学院)