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


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

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

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


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

以下是引用lxl在2010-7-1 17:19:00的发言:
BitConverter.ToString(val) 就是你想要的字符串

 

呵呵,学习了,还不知道有这个呢。

 

图片点击可在新窗口打开查看


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


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

谢谢,我试试。

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


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

With Ports("COM1")
    Dim cnt As Integer = .BytesToRead
    If cnt > 0 Then '缓冲区是否有数据
       Dim Val(cnt - 1) As Byte
       .Read(val,0,cnt)

       Messagebox.show(BitConverter.ToString(val))
    End If
End With

 

 不过你的操作不应该是把val转成16进制字符串。

而应该直接对byte数组进行操作。

数组的第8-12位表示重量

 


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


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

以下是引用lxl在2010-7-1 17:27:00的发言:

With Ports("COM1")
    Dim cnt As Integer = .BytesToRead
    If cnt > 0 Then '缓冲区是否有数据
       Dim Val(cnt - 1) As Byte
       .Read(val,0,cnt)

       Messagebox.show(BitConverter.ToString(val))
    End If
End With

 

 不过你的操作不应该是把val转成16进制字符串。

而应该直接对byte数组进行操作。

数组的第8-12位表示重量

 

 是这样,仪表数据是每隔0.3秒发送一次的,数据包含不稳定标志,只有含稳定标志的数据包才可取重量。担心0.3秒内取到的数据是不完整的。


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


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

以下是引用baoxyang在2010-7-2 8:40:00的发言:

 是这样,仪表数据是每隔0.3秒发送一次的,数据包含不稳定标志,只有含稳定标志的数据包才可取重量。担心0.3秒内取到的数据是不完整的。

一样可以用BitConverter类来处理。 它是专门用来对字节数组进行转换的类。

BitConverter.ToInt32(val,8)  返回的整数值就是你的重量

至于仪表的状态 可以直接通过val(9)来 判断。

我根据你4楼的说明给你列出来:

val(9) And 3      结果0 表示没有小数点, 结果2表示有小数点

val(9) And 12    结果0 表示毛重。返回其他结果,你4楼没说

val(9) And 16    结果0稳定  结果1不稳定。 


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


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

以下是引用lxl在2010-7-2 10:30:00的发言:

一样可以用BitConverter类来处理。 它是专门用来对字节数组进行转换的类。

BitConverter.ToInt32(val,8)  返回的整数值就是你的重量

至于仪表的状态 可以直接通过val(9)来 判断。

我根据你4楼的说明给你列出来:

val(9) And 3      结果0 表示没有小数点, 结果2表示有小数点

val(9) And 12    结果0 表示毛重。返回其他结果,你4楼没说

val(9) And 16    结果0稳定  结果1不稳定。 

"00 0f 01 cc“仪表发送的重量数据包部分,表示重量是953800,BitConverter.ToInt32(val,8)这个还真不懂.其中‘8’表示取8个字节吧。Val是字节数组,没有从第几个字节取数,不明白?谢LXL版主指点!

 

另外,val(9) And 16    这个也不太明白。不好意思!别笑话我了!!请教了!!!

[此贴子已经被作者于2010-7-2 10:51:02编辑过]

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


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

 

BitConverter.ToInt32(val,8) 表示从byte[]数组第8个成员开始读取。

Int32 是4字节32位的整数。  从第8个byte开始读取4个字节 刚好是 00 0f 01 cc

 

 

对两个数进行And  Or 运算,是对这两个数进行位运算。

比如 6 and 3 = 2

6的2进制是 0110

3的2进制是 0011     (and运算)

——————————————

结果就是     0010   (十进制的2)

and 要求 两个数的对应位置上都是1  结果位才是1

 

 

比如6 or 3 = 7

6的2进制是 0110

3的2进制是 0011     (or运算)

——————————————

结果就是     0111     (十进制的7)

or运算 只要对应位有一个为1  结果位就是1

 

 

 

你4楼有这么说的:

0x10 为数据项的第五字节,即00010000b,D0D1为0,说明当前仪表显示没有小数点,微机直接显示没有小数点的数据即可,若接收的数据为983500,直接显示成9835kg即可;如果D0D1为2,若接收的数据为983500,则应显示为9835.00kg;D2D3为0,说明当前仪表称重状态为毛重;D4为1,表明当前重量还不稳定,当D4为0时,当前重量稳定,仪表上显示稳定标志;

仪表可能返回 00010000 表示状态不稳定

   也可能返回 00000000 表示状态稳定

   也可能返回 00000010 表示状态稳定。同时表示结果值是带小数点的。

 

我们只需要检查D4位就行了。所以用返回值和16(二进制0001000)进行and运算。

因为16的D4位是1  其他位是0 。 正好可以得出返回值的D4位

 

 

 

 

 

 

[此贴子已经被作者于2010-7-2 11:34:30编辑过]

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


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

有一个地方我弄错了。

表示状态的不是val(9) 二是val(12)图片点击可在新窗口打开查看

 

还有一点。可能有时候l得到串口返回来的byte() 是两个数据包,或者多个数据包。

所以得处理一下。把他们分成几个数据包。

val数组要保证是从 FF AA开始的。而且长度刚好是1个数据包。

 


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


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

太谢谢lxl版主热心帮助。我试试先!有遇到问题,再请求帮忙,再此表示忠心感谢!!!


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


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

LXL版主请进,现读取串口数据包是 

 

With Ports("COM1")
    Dim cnt As Integer = .BytesToRead
    If cnt > 0 Then '缓冲区是否有数据
       Dim Val(cnt - 1) As Byte
       .Read(val,0,cnt)

       Messagebox.show(BitConverter.ToString(val))
    End If
End With

 

得到字符串是 

FF-AA-0D-30-0D-CE-64-A6-00-11-45-E0-00-00-07-03-5F

字节之间含“-”

 

"00-11-45-E0“仪表发送的重量数据包部分,表示重量,BitConverter.ToInt32(val,8)这样不行吧,请LXL版主指点!


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