找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于单片机自定义通讯协议的一个的问题

[复制链接]
跳转到指定楼层
楼主
ID:976190 发表于 2023-2-6 20:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
300黑币
现自定义PC机与单片机的通讯协议为:包长+数据段

例:05 0A 0B 0C 0D 0E
假设现在受到通信干扰,包长数据改变为04,那么单片机接收到的就是数据0A 0B 0C 0D 而数据0E则会被当成下一次数据包的包长,造成通信错误。
请问一下如果遇到这种状况应该怎么解决?小弟已经想一天了

最佳答案

查看完整内容

你定的协议解决不了问题。 给你MODBUS的解决方案: MODBUS/ASC以":"作为帧头标志,"\r\n"(0xa、0xd)作为帧尾标志,数据帧只有字母和数字的ASCII码,不可能出现帧头帧尾的字符。 MODBUS/RTU以3.5字符的总线空闲时间做帧头标志,如果出现传输3.5个字符的总线空闲时间,则刚才收到的最后一个字符则为帧尾,接下来收到的第一个字符就是帧头。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-2-6 20:41 | 只看该作者
你定的协议解决不了问题。

给你MODBUS的解决方案:

MODBUS/ASC以":"作为帧头标志,"\r\n"(0xa、0xd)作为帧尾标志,数据帧只有字母和数字的ASCII码,不可能出现帧头帧尾的字符。

MODBUS/RTU以3.5字符的总线空闲时间做帧头标志,如果出现传输3.5个字符的总线空闲时间,则刚才收到的最后一个字符则为帧尾,接下来收到的第一个字符就是帧头。
回复

使用道具 举报

板凳
ID:525244 发表于 2023-2-6 22:36 来自手机 | 只看该作者
两个办法,一个办法前边加上3个数据包长度,两个一样或三个一样的有效!方法二:用接收结束延时法!必须一个字节1ms,接收完一个字节,然后定时器计时,来一个字节再清零,没有字节接收之后,定时器计到3-10ms之后,判断接收完成。还有其他方法!多思考!
回复

使用道具 举报

地板
ID:771630 发表于 2023-2-6 22:57 | 只看该作者
直接加个累加校验或者异或校验就行了
回复

使用道具 举报

5#
ID:419968 发表于 2023-2-6 23:16 | 只看该作者
可以通过计时解决。因为发送肯定连续发送的,假设每字节最大发送时间间隔1ms,那么毎接受一个字节开始计时超过1.5ms认为本次接受结束
回复

使用道具 举报

6#
ID:86926 发表于 2023-2-7 08:05 | 只看该作者
最后用个字节做校验就好了,一直这样用
回复

使用道具 举报

7#
ID:844772 发表于 2023-2-7 08:49 | 只看该作者
最好再加上CRC验证,错一位还能修正过来。
回复

使用道具 举报

8#
ID:370884 发表于 2023-2-7 09:49 | 只看该作者
那你可以将协议扩展一下加一个校验啊  校验不对说明这包数据有误   如果你想指导通信中哪一位误码了,还可以加纠错编码啊
回复

使用道具 举报

9#
ID:1034262 发表于 2023-2-7 09:57 | 只看该作者
校验都没有,非常不可靠。
用CRC16校验吧,参考MODBUS-RTU协议。
我建议直接用MODBUS-RTU协议,工控上,我从90年代一直用到现在,全球通用。
回复

使用道具 举报

10#
ID:390412 发表于 2023-2-7 11:00 | 只看该作者
格式可以改成 : 包头  数据长度 数据 校验和 包尾
                        校验和 = 包头+数据长度+数据+包尾

接收端:判断if(rx_buf[0]==包头 && rx_buf[4]==包尾)
                    {
                        u8 JiaoYan=rx_buf[0]+rx_buf[1]+rx_buf[2]++rx_buf[4]; //校校验=包头+数据长度+数据+包尾
                       if( JiaoYan == rx_buf[3] )  //校验正确
                        {
                            //开始接收数据
                            dat[0]=rx_buf[2]
                        }
                  }
//注意:自定义协议的数据不能包含包头和包尾一样数据,如果是自定义的应该可以避免这个问题

回复

使用道具 举报

11#
ID:130230 发表于 2023-2-7 18:00 | 只看该作者
加帧头长度及校验给你参考:帧头高8位(head high) 帧头低8位(head low) 帧数据长度(payloadLen ) 保留字节(res ) 命令类型(cmdType) 命令数据(cmdPayload) 帧校验(check)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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