下面给出在Win2000下利用VB6.0的MSComm控件开发计算机与一智能采集模块进行串行通信的程序实现。在工控领域内,智能采集模块有着相当重要的地位,它可以通过串口通讯协议(RS232、RS485等)或其他通讯协议与PC机相连,并与外界现场信号直接相连或与由传感器转换过的外界信号相连,由PC机中的程序控制并实现采集现场的模拟信号,并处理采集到的现场信号并输出模拟控制信号、开关量输入输出等功能。因此,智能采集模块在工业控制领域内有着极其广泛的应用。本例子中的智能采集模块与计算机进行通信时,采用一位开始位、一位停止位、7位数据位、偶校验方式,波特率为9600bps.(1)在窗体中添加名为MyComm的MSComm控件,并设置空间的属性,如下:.CommPort=1 ‘使用COM1.Setting=”9600,e,8,1” ‘波特率9600,偶校验,8个数据位,1个停止位.InBufferSize=40 ‘设置MyComm接收缓冲区为40个字节.OutBufferSize=2 ‘设置MyComm发送缓冲区为2个字节.InputMode=comInputModeBinary‘设置接收数据模式为二进制模式.InputLen=1 ‘设置一次从接收缓冲区读取字节数为1.Sthreshold=1 ‘设置一次从发送缓冲区读取字节数为1.PortOpen=True ‘打开通信口
‘其他属性设置省略
(2)下面是响应Mycomm_OnComm事件的处理程序,对数据库采集的处理程序采用MSComm事件驱动方式。Private Sub MyComm_OnComm()With MyCommSelect case .CommEventCase .comEvReceive‘ 接收数据 ‘ 对数据进行处理case .comEVSend‘发送数据case .comEventRxParity‘对奇偶校验错误进行处理end select
end withend sub
当接收的数据少于发送的数据时的解决办法如果通过MSComm控件一次性传送较多的二进制数据,那么,很可能收到的数据不足。例如在设置为2400bps传输率的情况下,一次性可以传输2048个字符数据,那么在大多数情况下一次只能收到1200个字符左右,这是因为新版的MSComm32.OCX中存在一个影响传输二进制数据的Bug。 32位Windows API函数使用了几个用COMMTIMEOUTS结构表示的限时变量,WriteTotalTimeOutConstant即是其中的一个,它被Windows内部设定为5000(即5秒),这个常量决定了在通信驱动程序停止传输之前花费在发送缓冲区中数据的时间的长短。5秒钟意味着通信速度为1200bps情况下仅能发送600个字符,2400bps情况下仅能发送1200个左右的字符。事实上,在一个缓冲区内一次性发送更多的数据是非常可能的。VB 5.0/6.0版本的MSComm控件有一个新增的重要的属性称为CommID,CommID指的是当串口被打开时,被API所调用的串口句柄(或标志),这也意味着能利用API接口函数去修改这个常量。每次串口关闭后,Windows会自动将之恢复为5000,所以,每次打开串口后需要重新设定。以下是API声明代码: Type COMMTIMEOUTS ReadIntervalTimeout As LongReadTotalTimeoutMultiplier As Long ReadTotalTimeoutConstant As Long WriteTotalTimeoutMultiplier As Long WriteTotalTimeoutConstant As Long End Type Declare Function SetCommTimeouts Lib "Kernel32" (ByVal hFile As Long , _lpCommTimeouts As COMMTIMEOUTS) As Long Declare Function GetCommTimeouts Lib "Kernel32" (ByVal hFile As Long , _lpCommTimeouts As COMMTIMEOUTS) As Long Dim timeouts As COMMTIMEOUTS Dim Ret As Long If Comm1.PortOpen = False Then Comm1.PortOpen = True End If '打开串口后重新设定串口句柄 Ret=GetCommTimeouts(Comm1.CommID,timeouts) 'Set some default timeouts timeouts.ReadIntervalTimeout = 1 timeouts.ReadTotalTimeoutMultiplier = 1 timeouts.ReadTotalTimeoutConstant = 1 timeouts.WriteTotalTimeoutMultiplier = 1 timeouts.WriteTotalTimeoutConstant=(Comm1.OutBufferSize \ Val(Comm1.Settings))*10000+1000 Ret=SetCommTimeouts(Comm1.CommID,timeouts)
4.结束语本文结合实例介绍了基于VB6.0的MSComm串行通信设计方法。
参考书目:1、 范逸之等.利用Visual Basic 实现串并行通信技术 清华大学出版社 2001.32、 黄淼云等.Visual Basic控件高手 北京希望电子出版社 2001.13、 范逸之等.Visual Basic与RS-232串行通信控制最新版 中国青年出版社 2002.1