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


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

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

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


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

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

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


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

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

 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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位表示重量

 


 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | 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不稳定。 


 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | 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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | 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个数据包。

 


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


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

呵呵 想必试出来来了:短横线不影响结果。
那个短斜杠本来是不存在的。是.net的方法:BitConverter.ToString 为了看起来方便加上的横线。
这个了ToString方法 并没有改变val的值,所以不会影响ToInt32方法。

没有短横线,看起来会很不直观。
比如FFAA0D300DCE
可能看错位 FA-A0-D3-00-DC-

 回到顶部