485通讯抗干扰,超时重发,不断重连的编程思路
在工程中会遇到一种情况,当通信受到干扰之后,数据超时重发多次,无法被成功发出去,当恢复干扰后,之前发送的指令就被报错清掉了,相当于串口掉线之后,即使短暂时间内通信连上,掉线之后发出的指令也不生效。
为了确保受到干扰的这段时间里,发出的所有指令在干扰结束之后仍然可以立即起作用。
有如下设计思路
- 帧结束计时 (
Modbus_RTU.CmdTimeStart == 1
):- 如果在设定的时间内(例如10ms)没有接收到数据,则认为帧接收完成。
- 已经接收到了一个字节之后才会开启帧结束计时功能
- 超时重发计时 (
Modbus_RTU.CmdTimeStart == 2
):- 如果在设定的时间内没有接收到响应,则开始超时重发逻辑。
- 如果重发次数小于4次,则重置超时计时并增加重发次数。
- 如果重发次数达到或超过4次,则设置错误码
- 逻辑处理函数
- 如果出现重发失败,挂起当前发送,并且将重发重置。下次进入逻辑时,依旧会进行重发测试。这里的重发包括超时重发和crc校验错误重发。一个是发不出去导致的发送失败,一个是发送成功收到消息但是crc校验不通过的发送失败。
- 主站发送函数发送完之后,会自动开启重发计时功能。
- 主站接收函数接收回传的确认信息,进行CRC校验,如果校验错误,执行CRC校验错误重发
<