========= 串口通讯协议的问题 =========

愚者只看星不看答案 2018-02-06 08:39:55
我开发软件用于接收串口发送来的数据。现在有这样一个问题

假设协议约定

00 00 00 04 0f 0e ff ff

前面4个字节表示整个数据有多长 这里04 表示后面有 4 个字节
最后两字节 ff ff 为crc16

如果传输有误,04 变成了 05
那么认为没有接收完成, 等待下一个数据到来,假设接下来收到另一条正确的

00 00 00 04 0f 0e ff ff

此时认为这样的数据是一个完整的

00 00 00 05(误传的) 0f 0e ff ff 00

此时crc16校验失败,放弃此条数据,那么问题是后面接下来的所有数据都错了,怎么解决?

此种情况下应该关闭串口再打开吗?还有什么更好的方法?多谢!
...全文
831 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
renhaobin 2018-03-23
  • 打赏
  • 举报
回复
做一个循环队列,收到错误时候此数据不丢,下次接收的数据放在错误数据尾部,然后重新找 00 00 00 04 如果找到正确的数据,则把前部分数据丢掉。
JacksonLiang 2018-03-21
  • 打赏
  • 举报
回复
通讯协议:开始标识+命令+ 数据长度n+ 数据 + 校验,通过协议检测函数就可以判断数据是否已接收完毕,检测到错误的数据后,可以根据机制忽略或请求重发。
华山沦贱 2018-03-11
  • 打赏
  • 举报
回复
第一,协议定义本身有问题,可靠的通信定义应该是标志头+(数据长度)+校验+标志尾 第二,如果通信速度不快的话,可以在软件里面设超时。比如可以设定如果50ms内没有数据再来,可以认定本帧已发送完毕,可以接收处理了。 15年的C++工业串口通信编程经验!
vc_dreamver 2018-02-07
  • 打赏
  • 举报
回复
定义个帧头与帧尾呀,通过重新搜索帧头定位。你这协议定义的不好
ooolinux 2018-02-06
  • 打赏
  • 举报
回复
个人觉得,一收一答:收到正确,请求下一条数据;收到校验错误的数据,请求重传。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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