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

愚者只看星不看答案 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校验失败,放弃此条数据,那么问题是后面接下来的所有数据都错了,怎么解决?

此种情况下应该关闭串口再打开吗?还有什么更好的方法?多谢!
...全文
830 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
  • 打赏
  • 举报
回复
个人觉得,一收一答:收到正确,请求下一条数据;收到校验错误的数据,请求重传。
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题的解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。

1,316

社区成员

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

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