视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
VB串口控件固定帧格式通信编程实例-实时数据采集
2025-09-30 19:48:25 责编:小OO
文档
VB MSComm控件进行串口实时数据采集txt

本文介绍VB6.0利用MSComm通信控件,开发微机通过串口对工业仪表进行实时数据采集的编程技术。给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动后用于其他数据采集或实时控制程序中。

一台工业专用实时检测仪表,接高精度位移传感器,用于测量微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。该仪表带有一个9针的RS-232C 串口,能与微机进行串口数据通信,实时传送检测数据,通过微机软件处理可实现工业实时监控。 

该仪表的串口数据通信协议是:数据传输速率为 9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。仪表每秒发送50帧检测数据,每帧数据由4个字节组成。第一个字节定义为二进制常数0F0H,是每帧数据开始的标志字节;后面连续2个字节为数据字节,采用压缩的BCD码编码方式,高位在前,低位在后,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第四个字节为符号字节,该字节第八位为1,即: 1 x x x x x x x 则为负数;第八位为0,即: 0 x x x x x x x则为正数。 

例如:0F0H 26H 87H 80H   0F0H 34H 62H 00H 表示 -26.87   34.62。 

通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序。 

为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下: 

RThreshold = 1   接收缓冲区收到一个字节产生OnComm事件

InputLen = 1     每次充接收缓冲区读取一个字节

仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms时间,然后再进行数据处理。如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节),这时完全可以实现实时监测或实时控制;如果微机在20ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情况下接收缓冲区的大小就会影响实时监测效果,所以接收缓冲区设置不能过大,以保证数据处理的实时性。 

设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但用Input属性读取数据时,不能直接赋值给 Byte 类型变量,只能通过先赋值给一个 Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型数变量中。 

VB中有Byte类型变量,但没有字节的位处理语句,符号字节的位处理要判断符号字节的值是否大于 127,大于127则为负数;压缩的BCD码存入 Byte类型变量,VB系统只按十进制数处理,这要通过一个简单算法换算,解压BCD码才能还原成十进制表示数值。假如a是Byte类型变量,D是Single类型变量,将一个压缩的BCD 码存入a中,则算法是: 

D=(a\\16)*10 + a-(a\\16)*16 

则D=a-(a\\16)*6

----程序清单: 

----在通用声明中定义程序所用变量: 

Dim ab(4) As Byte    

 ‘字节数据类型数组,用来存储接收到的一组字节数据

    Dim av As Variant ‘用来从接收缓冲区读取数据

    Dim i As Integer

    Dim j As Integer

    Dim w As Integer       ‘接收数据个数计数器

    Dim b1 As Single

    Dim b2 As Single

    Dim WW As Single               ‘十进制检测值

    Dim MaxW As Single             ‘最大值

    Dim MinW As Single             ‘最小值

----在窗体中添加名为Command1的[开始]按钮和名为 MSComm1的MSComm控件。 

---- [开始]按钮的Click事件处理程序主要是对MSComm1控制的参数初始化设置,程序中大部分参数在设计时可在MSComm1控制的属性窗口中设置: 

Private Sub Command1_Click()

         ‘开始按钮

  With MSComm1

     .CommPort=2                        ‘使用COM2

     .Setting=“9600,N,8,1"              ‘设置通信口参数

     .InBufferSize=40                       

     ‘设置MSComm1接收缓冲区为40字节

     .OutBufferSize=2                                   

     ‘设置MSComm1发送缓冲区为2字节

     .InputMode = comInputModeBinary        

     ‘设置接收数据模式为二进制形式

     .InputLen = 1         

     ‘设置Input 一次从接收缓冲读取字节数为1

     .SThreshold = 1                        

         ‘设置Output 一次从发送缓冲读取字节数为1

     .InBufferCount = 0     ‘清除接收缓冲区

     .OutBufferCount = 0    ‘清除发送缓冲区

     MaxW = -99                    

     ‘最大值赋初值

     MinW = 99                         ‘最小值赋初值

     w = 0                                           

     ‘数据个数计数器清零

     .RThreshold = 1       

         ‘设置接收一个字节产生OnComm事件

     If .PortOpen = False Then                          

    ‘判断通信口是否打开

        .PortOpen = True      ‘打开通信口

        If Err Then                    ‘错误处理

          MsgBox “串口通信无效"

          Exit Sub

        End If

     End If

  End With

End Sub

----为了达到实时数据采集目的,实时数据采集处理程序采用MSComm事件驱动方式。 

----MSComm1_OnComm的事件处理程序只处理 comEvReceive事件,首先判断帧数据的开始字节,关闭OnComm接收事件,然后接收数据字节,将压缩BCD进行还原转换,再接收符号字节,判断数据符号,判断数据最大最小值,最后打开OnComm接收事件,等待下一次OnComm事件产生: 

Private Sub MSComm1_OnComm()

  With MSComm1

Select Case .CommEvent

         ‘判断MSComm1通信事件

      Case comEvReceive                     

                 ‘收到Rthreshold个字节产生的接收事件

        av = .Input        

                 ‘读取一个接收字节

        ab(1) = av(0)                        

                 ‘转换保存到字节数据类型数组

        If ab(1) = &HF0 Then                         

          ‘判断是否为数据开始标志

          RThreshold = 0                              

          ‘关闭OnComm事件接收

          Do

            DoEvents

          Loop Until .InBufferCount >= 3

      ‘循环等待MSComm1接收缓冲区>=3个字节

          w = w + 1                 ‘计数器累加计数

          av = .Input                        

         ‘读取第二个数据字节(BCD码高位字节)

          ab(2) = av(0)             

         ‘转换保存到字节数据类型数组

          av = .Input                                         

         ‘读取第三个数据字节(BCD码低位字节)

          ab(3) = av(0)             

                 ‘转换保存到字节数据类型数组

          av = .Input                        

                 ‘读取第四个数据字节(符号位字节)

          ab(4) = av(0)             

                 ‘转换保存到字节数据类型数组         

          b1 = ab(2) - 6 * (ab(2)\\16)       

         ‘高位字节压缩BCD码转换为实数

          b2 = ab(3) - 6 * (ab(3)\\16)       

         ‘低位字节压缩BCD码转换为实数

          WW = b1 + b2 / 100                         

         ‘数值组合,标定小数点

          If ab(4) > 127 Then WW=WW        

                   ‘判断数据符号位

          Label1(0) = Format(WW, “0.00")

                   ‘显示毫米单位数值,2位小数

          Label1(1) =Format(WW /25.4, “0.000")

         ‘显示英寸单位数值,3位小数

If WW > MaxW And WW < 51 Then

----‘判断最大值,仪表在刚开始工作时有干扰,会传导一些乱码,位移传感器有参数偏差,最大值一般都略大于50毫米,所以取51为极限最大值,取-51为极限最小值。 

     MaxW = WW

     Label1(2) = Format(MaxW, “0.00")          

     ‘显示毫米单位最大值,2位小数

     Label1(3) = Format(MaxW/25.4,“0.000")

     ‘显示英寸单位最大值,3位小数

     End If

If WW < MinW And WW > -51 Then

     ‘判断最小值

     MinW = WW

     Label1(4) = Format(MinW, “0.00")          

     ‘显示毫米单位最小值,2位小数

     Label1(5) = Format(MinW/25.4,“0.000")

       ‘显示英寸单位最小值,3位小数

           End If

           .RThreshold = 1  

          ‘打开MSComm1事件接收

     End If

   Case Else

  End Select

  End With

End Sub下载本文

显示全文
专题