Foxtable(狐表)用户栏目专家坐堂 → [求助] 菜鸟求称重串口接收代码


  共有9447人关注过本帖树形打印复制链接

主题:[求助] 菜鸟求称重串口接收代码

帅哥哟,离线,有人找我吗?
baoxyang
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3313 积分:23134 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2013/3/2 17:09:00 [显示全部帖子]

f aa 0d 30 0d da e1 a6 00 0f 01 cc 10 00 01 03 98 (接收的字节数为17即代码中If cnt >= 17 Then为判断接收的字节数是否完整)
0xFF 0xAA为帧头;
0x0D为帧长度;
0x30识别码;
0x0d 0xda 0xe1,为地址码,即AD板编号,高位在前,相当于当前AD板编号为0x0ddae1,换成十进制即为0908001;
0xa6,为状态字节,表示当前数据为实时上传重量数据;
0x00 0x0f 0x01 0xcc 为仪表上传的实时重量信息,高位在前,为实际重量的100位,实际重量为0x000f01cc/100,即983500/100;
0x10 为数据项的第五字节,即00010000b,D0D1为0,说明当前仪表显示没有小数点,微机直接显示没有小数点的数据即可,若接收的数据为983500,直接显示成9835kg即可;如果D0D1为2,若接收的数据为983500,则应显示为9835.00kg;D2D3为0,说明当前仪表称重状态为毛重;D4为1,表明当前重量还不稳定,当D4为0时,当前重量稳定,仪表上显示稳定标志;
以后是我电子枰的接口说明.

With Ports("COM1")
    Dim cnt As Integer = .BytesToRead
    If cnt >= 17 Then '缓冲区是否有数据
        Dim Val(cnt - 1) As Byte
       .Read(val,0,cnt)
      Dim ss As String = BitConverter.ToString(val) ''BitConverter.ToString()的用法,这个就是把字节或字节数组转换为十六进制或十六进制的字符串形式,中间用“-”连接
      ss = ss.Replace("-","") '去掉转换成带-的十六进制的字符串中'-''
      ss = ss.Trim("") 
      Dim k As Integer
      Dim s(cnt - 1) As String '定义字节数组'
      For j As Integer = 0 To cnt - 1      '提取字节,保存到数组中去'
          k = j * 2
          s(j) = ss.substring(k,2)   '因为十六制是两位的数'(不含Ox)
      Next
       For i As Integer = 0 To cnt -2
           Dim st As String = s(i) & s(i+1) 
           If st = "FFAA" Then  (0xFF 0xAA为帧头;判断接收字节开始部分)
              If  (12+i) <= cnt -1 Then   (这段判断输出字节包含重量信息在内,因为接收字节可能是连续重复的数据在,保证在连续的有效17个字节内)       
                 If  s(12+i) = "00"  Then  (判断重量信息位置,为什么要用12,因为字节数有两个00,判断最后一个00的位置)
                     forms("电子称重").controls("textbox1").value = HexToDec(s(i+8) & s(i+9) & s(i+10) & s(i+11))/100 
                     's(i+8) & s(i+9) & s(i+10) & s(i+11) 是对应到 0x00 0x0f 0x01 0xcc 为仪表上传的实时重量信息,最后把十六制转换成十进制(HexToDec)'
                     '为实际重量的100位,所以需要除100'  
                 End If   
              End If  
           End If  
       Next
     End If
End With

请楼主自己分析吧,我不清楚此设备输出,也不好测试哦.

 回到顶部
帅哥哟,离线,有人找我吗?
baoxyang
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3313 积分:23134 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2013/3/4 7:48:00 [显示全部帖子]

With Ports("COM1")
    Dim cnt As Integer = .BytesToRead
    If cnt >= 11 Then '缓冲区是否有数据
        Dim Val(cnt - 1) As Byte
       .Read(val,0,cnt)
      Dim ss As String = BitConverter.ToString(val) ''BitConverter.ToString()的用法,这个就是把字节或字节数组转换为十六进制或十六进制的字符串形式,中间用“-”连接
      ss = ss.Replace("-","") '去掉转换成带-的十六进制的字符串中'-''
      ss = ss.Trim("") 
      Dim k As Integer
      Dim s(cnt - 1) As String '定义字节数组'
      For j As Integer = 0 To cnt - 1      '提取字节,保存到数组中去'
          k = j * 2
          s(j) = ss.substring(k,2)   '因为十六制是两位的数'(不含Ox)
      Next
      dim p1,p2 as integer
       For i As Integer = 0 To cnt -2
           Dim st As String = s(i)
           If st = "3D" Then  (=为0x3D;判断接收数据的开始部分)
              p1 = i
               If st = "3D" Then    ( =为0x3D;判断接收数据的结束部分)  
                  p2 = i     
                 If  p2 -p1 = 8 Then  '判断是否为含小数点
                     dim k1 as integer = HexToDec(s(p1+3) & s(p1+2) & s(p1+1))   '为整数部分
                     dim k2 as integer = HexToDec(s(p1+5) & s(p1+6) & s(p1+7))   '为小数部分
                     else if p2 -p1 = 7 Then  '判断是否为无小数点
'同上' 
                 End If   
              End If  
           End If  
       Next
     End If
End With

以上需要楼主测试下,因为说明不清楚

 回到顶部