用RS-232连接单片机与PC机,用vb将单片机中采集的数据传到PC机上并用VB编写代码在PC机上显示出来
Dim ab(4) As Byte '字节数据类型数组,用来存储接收的一组字节数据
Dim av As Variant '用来从接收缓冲区读取数据
Dim i As Integer
Dim j As Integer
Dim b1 As Single
Dim b2 As Single
Dim ww As Single '十进制检测值
Private Sub Command1_Click()
With MSComm1
     .CommPort = 1              '使用COM1
     .Settings = "38400,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     '清除发送缓冲区
     .RThreshold = 1
    '设置接收一个字节产生OnComm事件
     If .PortOpen = False Then
    '判断通信口是否打开
        .PortOpen = True       '打开通信口
        If Err Then        '错误处理
          MsgBox "串口通信无效"
          Exit Sub
        End If
     End If
 
  End With
End Sub
Private Sub Label1_Click()
 Label1 = Format(ww, "0.00")
End SubPrivate 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接收缓冲区>=4字节
            av = MSComm1.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 '数值组合,标定小数点
           
               
          
                  End If
       End If
        
 
        
                MSComm1.RThreshold = 1
                MSComm1.InBufferCount = 0          '清除接收缓冲区End
Case ElseEnd SelectEnd WithEnd Sub
关于
“b1 = ab(2) - 6 * (ab(2)(16)) '高位字节压缩BCD码转换为实数”
出现
编译错误 类型不匹配
请问该怎么改啊?

解决方案 »

  1.   

    本来我想输b1 = ab(2) - 6 * (ab(2)16)  这是个算法  但这样输入会出现错误   所以就改为上面的了
      

  2.   

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

  3.   

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