怎样处理这样的串口发来的数据帧?

yuanchao1985 2010-07-10 08:43:52

http://hi.csdn.net/attachment/201007/10/5595442_1278722062i3Kg.jpg





这是VB串口和单片机数据采集的通信,VB发命令,单片机接到命令后正确则返回传感器采集的数据。各位大神
能告诉我一些处理数据帧的技巧吗?还有MScomm的设置,我是纯新手。
...全文
519 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
flfq 2010-07-10
  • 打赏
  • 举报
回复
用MSCOMM控件数组,一个mscomm打开一个端口
yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 of123 的回复:]
如果是一对多方式,最好采用 RS485 广播协议。它的优点是通讯线采用普通电话线,可以长达 1000 米,所有从机并联到线上。

如果要通过多个 RS232 端口的话,可以用一块串口扩展板。在 VB 代码中可以设置 MSComm 控件的端口号。
[/Quote]

是不是一个MSComm控件,更改端口号 1、2 、 3 、 4 、5、 6,在代码中轮流处理?
of123 2010-07-10
  • 打赏
  • 举报
回复
如果是一对多方式,最好采用 RS485 广播协议。它的优点是通讯线采用普通电话线,可以长达 1000 米,所有从机并联到线上。

如果要通过多个 RS232 端口的话,可以用一块串口扩展板。在 VB 代码中可以设置 MSComm 控件的端口号。
yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 of123 的回复:]
CRC-16 校验有多种模式,上位端的必须与下位机一致。例如,同样对于 {0x31,0x32,0x33,0x34,0x35,0x36} 各种模式的结果为:

CRC-16 0xBB3D
CRC-16 (Modbus) 0x4B37
CRC-16 (Sick) 0x56A6
CRC-CCITT (XModem) 0x31C3
CRC-CCITT (0xFFFF) 0x29B1
……
[/Quote]

如果用VB采集6个单片机的话,怎样设置地址、串口号呢?还有怎样协调他们,让他们轮流接收命令,轮流发送采集的数据呢
yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
LH在这个项目中没有用到
of123 2010-07-10
  • 打赏
  • 举报
回复

CRC-16 校验有多种模式,上位端的必须与下位机一致。例如,同样对于 {0x31,0x32,0x33,0x34,0x35,0x36} 各种模式的结果为:

CRC-16 0xBB3D
CRC-16 (Modbus) 0x4B37
CRC-16 (Sick) 0x56A6
CRC-CCITT (XModem) 0x31C3
CRC-CCITT (0xFFFF) 0x29B1
CRC-CCITT (0x1D0F) 0xE5CC
CRC-CCITT (Kermit) 0x8921
CRC-DNP 0x82EA


实际上,需要确定的就是多项式是初始值。

CRC-16 0x8005 x16 + x15 + x2 + 1
CRC-CCITT 0x1021 x16 + x12 + x5 + 1
CRC-DNP 0x3D65 x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1




yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 of123 的回复:]
这个项目的协议很清楚,处理起来不困难。

接收数据采用 OnComm 事件驱动方式。

方法1:

触发条件设置为接收到 3 个字符。

在 OnComm 事件处理代码中,根据第三字节 nn 的值来确定后续的接收长度,循环等待到全部数据都收到。

方法2:

由于接收到的数据长度与命令中的读取长度有固定的对应关系,发出命令后实际上已知接收数据长度。

因此,可以设置事件……
[/Quote]


单片机采集每一个通道的电压和电流,分别用两个字节表示.LH 和LL 组合起来的两个字节表示要读取的通道数,所以,通道数=nn*1/4。这里应该是和下位机在这个项目中的约定
of123 2010-07-10
  • 打赏
  • 举报
回复

这个项目的协议很清楚,处理起来不困难。

接收数据采用 OnComm 事件驱动方式。

方法1:

触发条件设置为接收到 3 个字符。

在 OnComm 事件处理代码中,根据第三字节 nn 的值来确定后续的接收长度,循环等待到全部数据都收到。

方法2:

由于接收到的数据长度与命令中的读取长度有固定的对应关系,发出命令后实际上已知接收数据长度。

因此,可以设置事件触发条件为 LL*4 + 5。进入事件处理代码时,数据已经完全接收。

我不不解的是,命令中的读取长度仅仅是接收数据长度 nn (单字节)的四分之一,且上限也确定为 32,为什么还要用两个字节。实际上 LH 恒为 0。
zdingyun 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yuanchao1985 的回复:]
测试过了,可以用,我第一次遇到串口通信,数据帧处理也没有见过类似的例子,不知道怎么入手,你能帮我找一断帧处理的代码吗?谢谢了
[/Quote]
见6楼的连接.
yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zdingyun 的回复:]
引用 4 楼 yuanchao1985 的回复:
CRC校验我有一个网上复制过来的模块,查表的,这样可以吗

你必须测试过.
[/Quote]
测试过了,可以用,我第一次遇到串口通信,数据帧处理也没有见过类似的例子,不知道怎么入手,你能帮我找一断帧处理的代码吗?谢谢了
zdingyun 2010-07-10
  • 打赏
  • 举报
回复
zdingyun 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yuanchao1985 的回复:]
CRC校验我有一个网上复制过来的模块,查表的,这样可以吗
[/Quote]
你必须测试过.
yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zdingyun 的回复:]
LZ:你的重点在于找到计算CRC校验的代码.
[/Quote]
CRC校验我有一个网上复制过来的模块,查表的,这样可以吗
zdingyun 2010-07-10
  • 打赏
  • 举报
回复
LZ:你的重点在于找到计算CRC校验的代码.
yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
第二张图片没有显示出来,补一下
flfq 2010-07-10
  • 打赏
  • 举报
回复
定义一个byte数组,接收单片机发送的数据,然后进行校验,再根据通讯协议取得相应数据
yuanchao1985 2010-07-10
  • 打赏
  • 举报
回复
非常感谢大家!教会了我就是为社会主义建设做出了贡献

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧