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