串口发送数据,发送端怎么保证让接收端不会重复收到同一个命令?

lr2131 2019-06-27 09:31:12
如题。比如说发送端要给接收端发某种命令,叫A命令吧。

对于接收端来说,收到N条A命令和收到N+1条命令,会对接收端的逻辑处理有不同的分支影响。

也就是说,不能重复。

站在发送端,我不知道该怎么解决这个问题?当然,这种问题很可能是需要双方的代码和协议配合。
但要怎么做才能解决呢?


本来想这个通信的问题发到网络的版区可能会好一些,但是网络编程的支持往往有很多中间件或某些库,有去重的功能。所以问过去多半也不知道去重的原理只会用。如果是去中间件或库里找原理,那个可能就更麻烦了。

还请版友们多多帮忙,这种问题应该不是非常特殊。

...全文
1091 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2019-11-07
  • 打赏
  • 举报
回复
增加应答,一问一答的形式 牺牲效率保证准确先 treadoff
cp1300 2019-11-05
  • 打赏
  • 举报
回复
为何接收端去保证不收到重复的命令,应该是发送端不去发送重复命令就行,还是担心丢失,每次对命令进行了重发,可以使用流水号机制,发送方同一个命令多次发送使用同一个流水号,不同命令流水号依次自增,接收方处理时必须保证当前命令流水号比上次流水号大,否则认为重复命令,直接丢弃。
worldy 2019-09-19
  • 打赏
  • 举报
回复
串口不会重复接收

比如,你发送一个A,接收方只会接收一个A,

你如果循环发送n个A(假如发送速度得到控制,或者是通过中断),在通信正常情况下,接收方只能接收n个A,不会多不会少
yfpc2006 2019-09-19
  • 打赏
  • 举报
回复
串口中断服务程序中接收一条完整命令并校验数据头、长度、及CRC正确后,建立一个标志:例如 RX_OK_Flag = 1; 然后主程序: if(RX_OK_Flag == 1) { RX_OK_Flag = 0; //执行命令具体 } 再或者: 本次接收的命令为:RX1[]; 上次接收命令为:RX0[]; 下次接收的命令:RX2[]; 然后每次接收完进行对比,相同,都清零,不同,上次清0,这次执行。
皮皮涵 2019-06-29
  • 打赏
  • 举报
回复
你可以让接收端每接收一次,就发回一次
lr2131 2019-06-28
  • 打赏
  • 举报
回复
引用 4 楼 DigCore 的回复:
谢邀!

本人还是希望具体看看什么样的业务。

个人看法:
如果协议仍有扩展的可能,那么在A指令内增加每次发送的随机数,如果是同个事件、时间、功能或者。。。只要是“相同”的指令,随机数不改变。而如果即使还是A指令,由于事件、时间、功能等的改变而发送,此时可以把随机数更新后发送A指令。


另外,此帖标题就已经很明确了,是发送端“让”接收到不重复,个人理解就是:操纵发送端才是根本解决?



谢谢回复!

关注协议本身是可以的,但其实项目做多了,在做新的项目时,很可能隐性的设计目标是包含了通用性,一来做好了减少编码量,二来保证稳定性。正在参考MQTT中的漏发处理和去重功能。

在发送端是要做一些处理,但接收端也一样要配合的!


zgl7903 2019-06-28
  • 打赏
  • 举报
回复
合理的安排协议,做接收应答和错误/超时重发机制
lr2131 2019-06-27
  • 打赏
  • 举报
回复
引用 1 楼 qq_42020655 的回复:
发送方上一条命令与下一条命令不能重复,在命令发送完成后的下一行代码需要保存刚刚发送的命令,用于下一次发送前的比较,如果上一次发送的命令与这次需要发送的命令是相同的,那就不发送任何东西或者发送一个不是你的控制命令的特定的信号,如果是不一样的就发送现在需要发送的命令。希望对你有帮助。


谢谢回复!

保存已接收的命令,倒是可以,但是要保存就要删除,什么时候删除呢?下一次发个不一样的,就删除?似乎可行。

另外,关键是怎么确认这一次同样功能的命令,发送表示的不是同一次呢,在命令上怎么弄,才能看出是不一样呢?
qq_42020655 2019-06-27
  • 打赏
  • 举报
回复
发送方上一条命令与下一条命令不能重复,在命令发送完成后的下一行代码需要保存刚刚发送的命令,用于下一次发送前的比较,如果上一次发送的命令与这次需要发送的命令是相同的,那就不发送任何东西或者发送一个不是你的控制命令的特定的信号,如果是不一样的就发送现在需要发送的命令。希望对你有帮助。
forget345 2019-06-27
  • 打赏
  • 举报
回复
命令要看几个字节,以及发送的频率,比如1秒发一帧,4个字节,那可以简单的用 unix 时间来做命令
DigCore 2019-06-27
  • 打赏
  • 举报
回复
谢邀!

本人还是希望具体看看什么样的业务。

个人看法:
如果协议仍有扩展的可能,那么在A指令内增加每次发送的随机数,如果是同个事件、时间、功能或者。。。只要是“相同”的指令,随机数不改变。而如果即使还是A指令,由于事件、时间、功能等的改变而发送,此时可以把随机数更新后发送A指令。


另外,此帖标题就已经很明确了,是发送端“让”接收到不重复,个人理解就是:操纵发送端才是根本解决?


dceacho 2019-06-27
  • 打赏
  • 举报
回复
不需要那么麻烦,发命令是带一个命令ID就可以,这个ID发一次加一次,有些场合为了可靠需要重发多次时也可以轻松应对

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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