stm32板间串口通信escape协议
生活随笔
收集整理的這篇文章主要介紹了
stm32板间串口通信escape协议
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近有使用串口的需求,用于兩塊板間的TTL串口通信,目前常見的串口通信協議可以歸納為兩種模式
- 使用串口和一個定時器的通信協議【嚴格限制時間,常見協議為Modbus RTU】
- 使用單個串口的通信協議【存在數據頭、數據尾,常見協議為三菱PLC使用的串口控制協議】
對于上述兩種模式的優劣勢我是如下理解的:
- 串口加定時器模式能夠較好的限制通信時間,優勢是在多設備通信過程中不會存在因某個通信包未發送完而導致通信系統癱瘓的問題;其劣勢在于MCU板上資源緊張的情況下可能會無法抽出定時器給串口使用,串口通信效率為100%;
- 單串口通信的優勢也就在于僅需一個串口即可實現數據的正常收發,缺點在于需要對電文進行額外處理,需要嚴格區分包頭和包尾與中間數據,根據不同協議,串口通信效率一般低于100%。
綜上即可根據不同的通信場景選擇對應的通信模式,能夠趨利避害,發揮對應優勢
- 針對于需要多機在同一總線通信的情況下需要使用串口+定時器的通信模式,以防某個設備的通信故障導致其余正常設備無法通信。
- 針對于單點對單點通信則可以選擇單串口通信模式,因為僅存在單設備,若出現通信故障則需要修整,不存在干涉到其它設備的問題。
單串口通信的幾種方式
單串口通信的數據包基本可以固定為以下模式
由于通信過程中可能出現的數據位0x00~0xFF,涵蓋了所有發送過程會出現的字符,所以在區分包頭和包尾有了以下幾種解決方案
- 將數據轉換為ASCII碼進行發送,例如數據0xA1需要解析成0x41和0x31【A的ASCII碼和1的ASCII碼】,該方法我是在三菱的串口通信協議中習得,顯而易見的是該方法將單個數據拆分為兩個數據,而數據僅使用了ASCII碼的0-9、A-F,包頭選擇為0x01,包尾為0x03,數據與包頭尾的問題得到解決。但缺點在于通信效率只有正常通訊效率的50%【一個數據拆分為兩個字符發送】,可見效率較為低下;
- 采用關鍵字進行特殊處理,就是所謂的Escape協議,例如使用關鍵字0x81,包頭變為0x81后接0x01,包尾變為0x81后接0x03,正常數據發送時,若要發送0x81,則發送0x81后接0x81實現,該方法也同樣能解決包頭包尾與數據內容的沖突,其通訊效率在極端情況下【傳遞的所有數據都與關鍵字相同】此時由于包頭包尾都帶關鍵字,所以效率會略低于50%,但在正常情況下,其期望通信效率約為99.8%,其通訊效率根據數據包內關鍵字的數量會出現變動。
Escape協議為串口底層協議,僅用于區分包頭與數據內容
| 關鍵字 | 包頭碼 | 數據 | 數據 | 。。。 | 數據 | 關鍵字 | 包尾碼 |
如果數據內容與關鍵字一致,則需要發送一次關鍵字、一次數據內容。
本文僅提供一種思路,具體編碼方案因人而異,我僅提供一種解決思路,代碼文件點擊此處Escape代碼
總結
以上是生活随笔為你收集整理的stm32板间串口通信escape协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git pull常见用法
- 下一篇: 暗黑三使用服务器维护,暗黑3官网3月26