您现在正在浏览:首页 > 职教文章 > 职教论文 > VB中MScomm控件通信方式的使用

VB中MScomm控件通信方式的使用

日期: 2010-3-15 6:53:27 浏览: 369 来源: 学海网收集整理 作者: 未知

1 引言
VB开发串口通信程序常用的方法是利用VB自身提供的控件MScomm来实现,该控件隐藏了大部分串口通信的底层运行过程和许多烦琐的处理过程,将串口封装起来,操作容易、易实现。同时支持查询法和事件驱动通信的机制。文中主要介绍两种通信方法的使用。
2 查询法[ ]
查询法是通过周期性地读取缓冲区的信号来发现是否有事件发生并进行处理的方法。它不使用端口的硬件中断,必须在足够频繁地查询端口的情况下才能保证不会遗失任何数据或者事件,查询的频率取决于缓存的大小、数据量和对快速响应的要求。查询法不具有自动判断通信的“智能”化,需要人为启动接收或发送数据。在通信发生前就用查询法来判断接收数据,难免额外占用CPU 的资源,在庞大的实时系统中会有诸多不便。因此,查询法实用于较小、简单的程序。对于简单的发送接收程序,设置Rthreshold一0(不触发OnComm 事件),MScomm1.Inputlen=0(一次从接收缓冲区读取所有字节)示例如下:MSComm1.Output=SendCommand’sendcommand代表发送命令帧,不同的通信协议有不同的发送帧格式Do ’有的也用SLEEP函数来延时处理
DoEvents()
Loop Untill MSComm1.InbufferCount﹥一Receivelen’接收字符串长度
Do Receivedata= M SComm1.Input
Loop Until1.MSComm1.InbufferCount=0’读完应答帧
3 事件驱动法[ ]
事件驱动法是利用MScomm控件的OnComm事件触发机制来完成的。每当有通信错误或通信数据发生时,就会产生此事件。该方法能自动判断通信的发生并触发中断响应,只有通信发生时才响应中断,通信未发生时不占用CPU资源,此时能够进行其他工作。事件的处理是通过判断CommEvent属性值获得事件类型,再根据事件类型进行相应数据处理。大部分通信程序都使用该方法,但对于不同的通信要求,该方法的使用也有所不同。
3.1 定长数据的处理
事件驱动法能够自动判断通信的发生并触发中断响应是通过设置MScomm 控件的Rthreshold属性来实现的。当Rthreshold: ”时,接收缓冲区收到”个字节的数据就触发OnComm 事件。可见,对仪表发送定长数据的处理很方便,只要设置Rthreshold为接收数据的固定长度,InputLen属性设置为O,在OnComm事件中编写处理过程。示例如下:
Private Sub MSComml— OnComm()
Dim Receivedata() As Byte
Dim bytData As Variant’接收缓冲区读取数据
On Error Resume Next
Select Case CommEvent
Case comEvReceive
bytData=M SComm1.Input
Redim Receivedata (Ubound(bytData)As Byte
For i一0 To Ubound(bytData)
Receivedata(i)= bytData(i)
Next i
End Select
End Sub
3.2 不定长数据的处理
在某些串口通信中,仪表发送的数据帧是不定长的,在使用事件驱动法响应时,为了实现实时监测功能,接收数据时读取要尽可能的快。在程序开始运行时设置Rthreshold属性,接收缓冲区收到1字节产生OnComm事件,InputLen一1(每次读取一个字节),等到程序接收一帧完整数据后,计算出当前帧数据长度,再将Rthreshold属性修改为帧长度,则接收缓冲区在收到一帧数据后,MSComm控件才会触发一个OnComm 事件。这样就会有更多的时间对数据进行计算和处理。
比如数据帧最大长度为26,帧格式首字节为02H,第二个字节表示状态,反映发送的字节数Len,之后的第3到24个字节为需处理的数据,无结束标志。先设置Rthreshold= 1,然后计算实际长度Len,OnComm事件部分处理程序如下:
Dim Len As Interger Dim Receivedata(4)As Byte ’根据具体需要设定数组大小Dim bytData As Variant’接收缓冲区读取数据Private Sub MSComml— OnComm()Select Case CommEvent ’判断MSComml通信事件Case comEvReceive ’收到Rthreshold个字节产生的接收事件bytData=MSComm1.Input ’读取一个接收字节Receivedata(1)一bytData (O)’转换保存到字节数据类型数组Receivedata(0)一2 Then ’判断是否为数据开始标志O2HRthreshold一0 ’关闭OnComm事件接收bytData=MSComm1.Input ’读取一个接收字节Receivedata(1)一bytData (0) ’转换保存到字节数据类型⋯.在此写计算实际字节数LenbytData= MSComm1.Input⋯ ’数据处理程序Rthreshold=Len+2 ’打开MSComml事件接收再按完整数据帧触发事件ElseRthreshold= 1End Select End Sub
4 二者相结合的方法及其实现当测试系统要求不定时地将不定长的数据通过串口传给PC机,PC机要实时接收并进行处理保存时,仅用查询法或事件驱动法是不合适的,需用二者相结合的方法来实现。通过在OnComm事件中查询端口,当串口缓冲区接收到数据时,触发OnComm 事件,这时启动定时器查询端口,同时关闭OnComm事件触发,然后采用适当的查询频率以保证不丢失数据,接收完一帧数据后再打开OnComm事件等待下一次的触发。此时,当串口缓冲区没有接收到数据时,不触发OnComm事件也就不会启动定时器查询端口,释放了CPU 资源,缩短了程序运行时间。
比如测试要求:
(1)仪表每次不定时发送一帧数据,帧长从12字节到22字节不等。
(2)帧格式首字节为4CH,之后为10到20个字节之间的数据,尾字节为24H。
在程序中设置MSComml的Rthreshold=1,InputLen一0,定时器Timer1.interval一1,
通信部分的主要程序代码如下:
Dim M ydata(22)AS Byte
Dim i as Integer
Dim Receivedata()as Byte
Private Sub MSComml
— OnComm()
On Error Resume Next
i一0
Select Case M SCom m1.Com mEvent
Case com EvReceive
Timer1.enabled=true
MSComm1.Rthreshold= 0
End Select
End Sub
Private Sub Timerl— Timer()
if M SComm1.InbufferCount﹥ 0 Then
Receivedata= M SComm 1.input
Else
Timer1.Enabled= Flase
End if
Do
M yData(i)==Receivedata(i)
if Mydata(i)一&H24 Then
MSComm1. Rthreshold= 1
Exit Do
End if
i+ 1
Loop
End Sub
5 结束语
在计算机与程控电子设备构成的测试控制系统中,串口通信的情况各有所异,使用合适的通信方法,才能保证数据采集的实时性、正确性,对数据采集完之后的数据处理部分以及数据库操作程序的实现部分均没有影响。确保测试控制系统的可靠性、稳定性。

返回顶部