标题: 关于单片机自定义通讯协议的一个的问题 [打印本页]

作者: suning    时间: 2023-2-6 20:41
标题: 关于单片机自定义通讯协议的一个的问题
现自定义PC机与单片机的通讯协议为:包长+数据段

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


作者: Hephaestus    时间: 2023-2-6 20:41
你定的协议解决不了问题。

给你MODBUS的解决方案:

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

MODBUS/RTU以3.5字符的总线空闲时间做帧头标志,如果出现传输3.5个字符的总线空闲时间,则刚才收到的最后一个字符则为帧尾,接下来收到的第一个字符就是帧头。
作者: zgrfox110    时间: 2023-2-6 22:36
两个办法,一个办法前边加上3个数据包长度,两个一样或三个一样的有效!方法二:用接收结束延时法!必须一个字节1ms,接收完一个字节,然后定时器计时,来一个字节再清零,没有字节接收之后,定时器计到3-10ms之后,判断接收完成。还有其他方法!多思考!
作者: XLinliY.Zhang    时间: 2023-2-6 22:57
直接加个累加校验或者异或校验就行了
作者: adject    时间: 2023-2-6 23:16
可以通过计时解决。因为发送肯定连续发送的,假设每字节最大发送时间间隔1ms,那么毎接受一个字节开始计时超过1.5ms认为本次接受结束
作者: 蓝魄    时间: 2023-2-7 08:05
最后用个字节做校验就好了,一直这样用
作者: glinfei    时间: 2023-2-7 08:49
最好再加上CRC验证,错一位还能修正过来。
作者: morty123    时间: 2023-2-7 09:49
那你可以将协议扩展一下加一个校验啊  校验不对说明这包数据有误   如果你想指导通信中哪一位误码了,还可以加纠错编码啊
作者: coody_sz    时间: 2023-2-7 09:57
校验都没有,非常不可靠。
用CRC16校验吧,参考MODBUS-RTU协议。
我建议直接用MODBUS-RTU协议,工控上,我从90年代一直用到现在,全球通用。
作者: 小星是么    时间: 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]
                        }
                  }
//注意:自定义协议的数据不能包含包头和包尾一样数据,如果是自定义的应该可以避免这个问题


作者: jizhongbiao    时间: 2023-2-7 18:00
加帧头长度及校验给你参考:帧头高8位(head high) 帧头低8位(head low) 帧数据长度(payloadLen ) 保留字节(res ) 命令类型(cmdType) 命令数据(cmdPayload) 帧校验(check)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1