Foxtable(狐表)用户栏目专家坐堂 → 请LXL版主指教,有关串口接收的数据包格式


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

主题:请LXL版主指教,有关串口接收的数据包格式

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


加好友 发短信
等级:狐精 帖子:3313 积分:23134 威望:0 精华:1 注册:2009/3/31 11:25:00
请LXL版主指教,有关串口接收的数据包格式  发帖心情 Post By:2010/7/1 16:28:00 [只看该作者]

电子吊称中的仪表串口发送微机的到数据包是十六制的。但接收的一串串“25517013481272311660041760016226”这样的数字,这不是厂家说的十六制呀?

 

项目:代码如下

With Ports("COM1")
    Dim cnt As Integer = .BytesToRead
    If cnt > 0 Then '缓冲区是否有数据
       Dim Val(cnt - 1) As Byte
       .Read(val,0,cnt)
         Dim v As String
         For Each t As Byte In Val
             v = v & t
         Next
         if forms("电子称重").opened then
             forms("电子称重").controls("textbox8").value = forms("电子称重").controls("textbox8").value & v
         else
             forms("电子称重").open()
             forms("电子称重").controls("textbox8").value = v

         end if
    End If
End With

 

请教下,是代码有问题吗?

[此贴子已经被作者于2010-7-8 10:10:35编辑过]

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


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/7/1 16:40:00 [只看该作者]

我没用过,估计发送端是将10进制的数据转换为16进制,然后以Ascii码的形式发送,你在接收端反过来操作。

 

实在不行,用笨办法,看看每个数字在接收端对应的byte值是什么。

为便于分析隔开一下:

 

For Each t As Byte In Val
       v = v & "|" &  t
Next

 

然后与实际的值比对。

 

 

 


 


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


加好友 发短信
等级:狐精 帖子:3313 积分:23134 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2010/7/1 16:40:00 [只看该作者]

因为至少十六制数据包必包含FF AA。但“25517013481272311660041760016226”是否任何字母的,肯定于厂家说的十六制不相符,请各位帮帮忙。不知错在哪里?

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


加好友 发短信
等级:狐精 帖子:3313 积分:23134 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2010/7/1 16:44:00 [只看该作者]

 

七、附数据包分析:

ff aa 0d 30 0d da e1 a6 00 0f 01 cc 10 00 01 03 98

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时,当前重量稳定,仪表上显示稳定标志;

 

 

看说明,应当不是十进制转换成十六制的。因为需要根据数据包进行分析的。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/7/1 16:46:00 [只看该作者]

byte是整数,不会有FFAA这样的字符,你收到的应该对应的ASCII码。

 


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


加好友 发短信
等级:狐精 帖子:3313 积分:23134 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2010/7/1 16:51:00 [只看该作者]

如果要完整取出数据包,用一个字符串变量显示出来,如“

ff aa 0d 30 0d da e1 a6 00 0f 01 cc 10 00 01 03 98" 十六制的形式的。

 

请各位,指点!本人拆腾了半天也弄不出来。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/7/1 16:58:00 [只看该作者]

加一行测试看看:

Messagebox.show(System.Text.Encoding.ASCII.GetString(val))

 

 

[此贴子已经被作者于2010-7-1 16:57:59编辑过]

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/7/1 17:09:00 [只看该作者]

没错的 255 正好是FF 170 正好是 AA

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


加好友 发短信
等级:狐精 帖子:3313 积分:23134 威望:0 精华:1 注册:2009/3/31 11:25:00
  发帖心情 Post By:2010/7/1 17:18:00 [只看该作者]

以下是引用lxl在2010-7-1 17:09:00的发言:
没错的 255 正好是FF 170 正好是 AA

请问,使用这个System.Text.Encoding.ASCII.GetString(val)就可以了吗?


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/7/1 17:19:00 [只看该作者]

BitConverter.ToString(val) 就是你想要的字符串

 回到顶部
总数 25 1 2 3 下一页