找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5278|回复: 28
打印 上一主题 下一主题
收起左侧

防止传感器串口数据紊乱将数据打包,关于包头包尾概念?

  [复制链接]
跳转到指定楼层
楼主
ID:819146 发表于 2022-1-14 23:14 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
想把多个传感器的数据通过串口上传到上位机上,为了防止数据紊乱,我在网上找到的解决方案就是将数据打包,一包一包的将数据上传到上位机上,没有找到相关的教程,就是想问一下包头包尾具体要怎么创建,使用的时候要注意些什么(问题可能有点蠢,萌新,请见谅)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2022-1-15 07:19 | 只看该作者
串口传输数据的基本单元是一个字节,所谓打包是按通信协议把一串字节集中传输。假设某设备需要准确实时传输3个字节有效数据。那么制定一个自定义通信协议,由7个字节组成:0xaa、0x07、0x01、0x02、0x04、0x0d、0x55。数据头,数据长度,3个有效数据,数据和得到的验证码,数据尾。当串口收到0xaa,表示有传输要求,接着收到0x07表示数据长度7个字节。当收完7个字节并且最后是0x55,就可以解析数据了。把除第6外其它6个字节相加,溢出部分抛弃,再与第6字节比较验证,相同回复正确信息并执行相应任务,不同回复要求重发信息。简单叙述,实际应用中验证方式多种多样,不一而足。
回复

使用道具 举报

板凳
ID:57657 发表于 2022-1-15 07:36 | 只看该作者
串口数据包就是所有字节紧挨着发送,超过规定时间没有接收到字节就开始解析,所谓的包头包尾就是固定的值 比如A5 5A。
回复

使用道具 举报

地板
ID:807591 发表于 2022-1-15 12:15 | 只看该作者
如果不是很复杂很长的数据,无需所谓包头包尾,最后一个字节设为CRC校验即可,传输那么多包头尾完全是浪费时间
回复

使用道具 举报

5#
ID:879809 发表于 2022-1-18 19:17 | 只看该作者
上位机实时性非常差的,利用超时标记帧头是非常不靠谱的。可以利用MODBUS/ASC的做法,帧头是":",帧尾是"\r\n",中间的数据不能出现这三个字符即可。
回复

使用道具 举报

6#
ID:824490 发表于 2022-1-18 21:18 | 只看该作者
给你一张图参考一下:




回复

使用道具 举报

7#
ID:879809 发表于 2022-1-19 01:53 | 只看该作者
名字不是重点 发表于 2022-1-18 21:18
给你一张图参考一下:

你这个逻辑上有问题的,要保证中间数据不会出现55AA、0D0A这样的组合,否则会认错帧头帧尾的。
回复

使用道具 举报

8#
ID:311903 发表于 2022-1-19 08:23 | 只看该作者
发表于 2022-1-19 01:53
你这个逻辑上有问题的,要保证中间数据不会出现55AA、0D0A这样的组合,否则会认错帧头帧尾的。

这种简单的协议如果担心数据里面有特殊值(包头/包尾),就把数据部分出现包头/包尾的做个转义也可以
回复

使用道具 举报

9#
ID:824490 发表于 2022-1-19 09:27 | 只看该作者
发表于 2022-1-19 01:53
你这个逻辑上有问题的,要保证中间数据不会出现55AA、0D0A这样的组合,否则会认错帧头帧尾的。

不管用什么数值作同步,这个问题都会存在。但用代码可以轻松解决:
我之前用过的如下:
同步头:
如果接收计数==1,且接收(计数-1)==0x55 &&  接收(计数)== 0xaa ,则接收计数+1,
否则 接收计数=0;
帧尾:
连续收到0x0d && 0x0a 时 判断帧长度:
如果接收计数==帧长度,且接收(计数-1)==0x0d &&  接收(计数)== 0x0a,则接收OK=1;
否则 接收OK=0;继续下一个字节接收。
在main()中只要读到接收OK=1就开始分配工作了。

欢迎指正~~
回复

使用道具 举报

10#
ID:236035 发表于 2022-1-19 11:43 | 只看该作者
可以参考一些成熟协议,如包头是4个 0xFF ,再加一个 0x55,包尾只需有校验字。
回复

使用道具 举报

11#
ID:899981 发表于 2022-1-19 11:53 | 只看该作者
自己定义,不过包头包尾要找的不常用好记的字节,例如AA.BB.FF,00,最好加简单校验,例如取反加一等。
回复

使用道具 举报

12#
ID:879348 发表于 2022-1-19 14:14 | 只看该作者
就是用特殊符号做开头结尾方便写程序,这些符号在正式数据中不会出现
回复

使用道具 举报

13#
ID:824490 发表于 2022-1-19 15:07 | 只看该作者
wufa1986 发表于 2022-1-19 14:14
就是用特殊符号做开头结尾方便写程序,这些符号在正式数据中不会出现

严格意义上来讲,没有什么特殊符号,因为数据传输的内容不可预知的,只能通过软件代码来过滤。
回复

使用道具 举报

14#
ID:879809 发表于 2022-1-19 15:31 | 只看该作者
名字不是重点 发表于 2022-1-19 15:07
严格意义上来讲,没有什么特殊符号,因为数据传输的内容不可预知的,只能通过软件代码来过滤。

怎么可能不可预知???MODBUS/ASC的精髓就是帧头":"帧尾“\r\n”,中间数据不可能出现这三个字符,只能是“01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.”。小伙子你还是见识的太少。
回复

使用道具 举报

15#
ID:824490 发表于 2022-1-19 15:46 | 只看该作者
你是说,“01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.”这几个字符就能代表0-255内的任何值了。
嗯呢,受教了!
回复

使用道具 举报

16#
ID:879809 发表于 2022-1-19 16:02 | 只看该作者
名字不是重点 发表于 2022-1-19 15:46
你是说,“01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ+-.”这几个字符就能代表0-255内的任何值了。
嗯呢,受 ...

ASCII码当然可以表示任意值,“-9999.888”也是ASCII,可比你以为的0~255范围大太多了。
回复

使用道具 举报

17#
ID:824490 发表于 2022-1-19 16:05 | 只看该作者
发表于 2022-1-19 15:31
怎么可能不可预知???MODBUS/ASC的精髓就是帧头":"帧尾“\r\n”,中间数据不可能出现这三个字符,只能 ...

如果传送一幅240*320的图片,本来只要传240*320*2(16位色值)的图片, 是不是要多传一倍的数据量?
MODBUS/ASC貌似对大数据传输不太友好来的。。
回复

使用道具 举报

18#
ID:824490 发表于 2022-1-19 16:10 | 只看该作者
发表于 2022-1-19 16:02
ASCII码当然可以表示任意值,“-9999.888”也是ASCII,可比你以为的0~255范围大太多了。

是的,我没接触过MODBUS的相关协议。。如我上一贴所言,传输速度会不会被打折扣了?因为你每一个字节都被拆成2个字节来发送,上位机要拆分、下位机要组合,感觉对实时性要求高的地方不太适用,比如在电机控制方面,速度慢了可能会出事的。望指点~~
回复

使用道具 举报

19#
ID:879809 发表于 2022-1-19 16:10 | 只看该作者
名字不是重点 发表于 2022-1-19 16:05
如果传送一幅240*320的图片,本来只要传240*320*2(16位色值)的图片, 是不是要多传一倍的数据量?
MOD ...

传图片用串口,你是不是有点儿什么疾患?
回复

使用道具 举报

20#
ID:879809 发表于 2022-1-19 16:21 | 只看该作者
名字不是重点 发表于 2022-1-19 16:10
是的,我没接触过MODBUS的相关协议。。如我上一贴所言,传输速度会不会被打折扣了?因为你每一个字节都被 ...

上位机本来就没实时性你要求本身就不合理。

单片机和单片机之间我更喜欢用MODBUS/RTU的形式来进行,帧数据一个字节内容可以是0~255之间任意值,总线空闲3.5字节时间,下面到来的第一个字符就是帧头。
回复

使用道具 举报

21#
ID:824490 发表于 2022-1-19 16:24 | 只看该作者
别急躁!
一些设备只有串口。即使看上去是USB的接口,但还是走串口的通道的。你不能更换新设备。没得说。
回复

使用道具 举报

22#
ID:824490 发表于 2022-1-19 16:30 | 只看该作者
发表于 2022-1-19 16:10
传图片用串口,你是不是有点儿什么疾患?

手持对讲机(用的就是1.77的屏),终端客户要求能更换开机LOGO,以及一些特定声音文件,而主控不支持USB,又没有插卡接口,只能走串口通道。这事多了去了。

回复

使用道具 举报

23#
ID:824490 发表于 2022-1-19 16:36 | 只看该作者
发表于 2022-1-19 16:21
上位机本来就没实时性你要求本身就不合理。

单片机和单片机之间我更喜欢用MODBUS/RTU的形式来进行,帧 ...

客户的要求,就是合理的。。
即使以专业的角度来分析不合理,我们也要将就他们的不合理。。说的很窝囊、很委曲,事实如此,竞争太激烈了。。
回复

使用道具 举报

24#
ID:236035 发表于 2022-1-20 11:09 | 只看该作者
包头不与数据重复可以加长字节。小概率事件不用考虑,非要考虑,还有纠错机制。
回复

使用道具 举报

25#
ID:624769 发表于 2022-1-20 21:40 | 只看该作者
个人觉得,如果不用 ASCII 传输,没什么必要加包头包尾的,开启串口的9位模式,外加每发送16个字节 + 接收端回应一个效验值,就足够了。
回复

使用道具 举报

26#
ID:1017183 发表于 2022-4-10 12:15 | 只看该作者
发表于 2022-1-19 15:31
怎么可能不可预知???MODBUS/ASC的精髓就是帧头":"帧尾“\r\n”,中间数据不可能出现这三个字符,只能 ...

请问,为什么以“:”为帧头,数据中可以出现冒号呀
回复

使用道具 举报

27#
ID:883242 发表于 2022-4-10 18:48 | 只看该作者
嵌入式大菜鸡 发表于 2022-4-10 12:15
请问,为什么以“:”为帧头,数据中可以出现冒号呀

你要传输什么数据一定要有冒号?写出来看々。
回复

使用道具 举报

28#
ID:310441 发表于 2022-4-11 07:40 来自手机 | 只看该作者
包头即可。用一串不会或者极小概率出现的数据作为你要传输数据的头。仅用来表示数据的起点。
回复

使用道具 举报

29#
ID:958310 发表于 2022-4-11 09:20 | 只看该作者
数据头-功能码-数据长度-有效数据~-CRC校验
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表