485通訊抗干擾,超時重發,不斷重連的編程思路
在工程中會遇到一種情況,當通信受到干擾之后,數據超時重發多次,無法被成功發出去,當恢復干擾后,之前發送的指令就被報錯清掉了,相當于串口掉線之后,即使短暫時間內通信連上,掉線之后發出的指令也不生效。
為了確保受到干擾的這段時間里,發出的所有指令在干擾結束之后仍然可以立即起作用。
有如下設計思路
- 幀結束計時 (
Modbus_RTU.CmdTimeStart == 1
):- 如果在設定的時間內(例如10ms)沒有接收到數據,則認為幀接收完成。
- 已經接收到了一個字節之后才會開啟幀結束計時功能
- 超時重發計時 (
Modbus_RTU.CmdTimeStart == 2
):- 如果在設定的時間內沒有接收到響應,則開始超時重發邏輯。
- 如果重發次數小于4次,則重置超時計時并增加重發次數。
- 如果重發次數達到或超過4次,則設置錯誤碼
- 邏輯處理函數
- 如果出現重發失敗,掛起當前發送,并且將重發重置。下次進入邏輯時,依舊會進行重發測試。這里的重發包括超時重發和crc校驗錯誤重發。一個是發不出去導致的發送失敗,一個是發送成功收到消息但是crc校驗不通過的發送失敗。
- 主站發送函數發送完之后,會自動開啟重發計時功能。
- 主站接收函數接收回傳的確認信息,進行CRC校驗,如果校驗錯誤,執行CRC校驗錯誤重發
<