通信設計中考慮協議的靈活性,經常把協議設計成“不定長度”。一個實例如下圖:銳米LoRa終端的通信協議幀。
如果一個系統接收上述“不定長度”的協議幀,將會有一個挑戰--如何高效接收與解析。 為簡化系統設計,我們強烈建議您采用“狀態機”來解析UART數據幀,并且把解析工作放在ISR(中斷服務程序)完成,僅當接收到最后一個字節(0x0D)時,再將整個數據幀提交給進程處理。 該解析狀態機的原理如下圖所示:
那么ISR處理這個狀態機來得及嗎?答案是:so easy!因為它只有3個動作,運算量十分小: 比較接收數據 -> 更新狀態變量 -> 存儲接收數據,C語言僅3條語句,翻譯成機器指令也不超過10條。
代碼清單如下:
/** *@briefStatusofreceivedcommunicationframe */ typedefenum { STATUS_IDLE=(uint8_t)0, STATUS_HEAD,/*RxHead=0x3C*/ STATUS_TYPE,/*RxType*/ STATUS_DATA,/*Datafiled*/ STATUS_TAIL,/*Tail=0x0D*/ STATUS_END,/*Endofthisframe*/ }COMM_TRM_STATUS_TypeDef; /** *@briefDataobjectforreceivedcommunicationframe */ typedefstruct { uint8_tbyCnt;/*Countof1field*/ uint8_tbyDataLen;/*Lengthofdatafield*/ uint8_tbyFrameLen;/*Lengthofframe*/ COMM_TRM_STATUS_TypeDefeRxStatus; uint8_ta_byRxBuf[MAX_LEN_COMM_TRM_DATA]; }COMM_TRM_DATA; /** *@briefDataobjectforreceivedcommunicationframe. *@notePreventraceconditionthataccessedbybothISRandprocess. */ staticCOMM_TRM_DATAs_stComm2TrmData; /** *@briefPutadatathatreceivedbyUARTintobuffer. *@notePreventraceconditionthiscalledbyISR. *@paramuint8_tbyData:thedatareceivedbyUART. *@retvalNone */ voidcomm2trm_RxUartData(uint8_tbyData) { /*Updatestatusaccordingtothereceiveddata*/ switch(s_stComm2TrmData.eRxStatus) { caseSTATUS_IDLE: if(COMM_TRM_HEAD==byData)/*IsHead*/ { s_stComm2TrmData.eRxStatus=STATUS_HEAD; } else { gotorx_exception; } break; caseSTATUS_HEAD: if(TYPE_INVALID_MIN 審核編輯:黃飛
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
狀態機
+關注
關注
2文章
492瀏覽量
27529 -
數據幀
+關注
關注
0文章
45瀏覽量
6739 -
csdn
+關注
關注
2文章
16瀏覽量
6844
原文標題:狀態機”來解析UART不定長度的協議幀
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Verilog狀態機+設計實例
在verilog中狀態機的一種很常用的邏輯結構,學習和理解狀態機的運行規律能夠幫助我們更好地書寫代碼,同時作為一種思想方法,在別的代碼設計中也會有所幫助。 一、簡介 在使用過程中我們常說
如何寫好狀態機
如何寫好狀態機:狀態機是邏輯設計的重要內容,狀態機的設計水平直接反應工程師的邏輯功底,所以許多公司的硬件和邏輯工程師面試中,狀態機設計幾乎是必選題目。本章在引入
發表于 06-14 19:24
?97次下載
什么是狀態機?狀態機5要素
玩單片機還可以,各個外設也都會驅動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態機編程、分層思想
狀態模式(狀態機)
以前寫狀態機,比較常用的方式是用 if-else 或 switch-case,高級的一點是函數指針列表。最近,看了一文章《c語言設計模式–狀態模式(狀態機)》(來源:embed linux
發表于 12-16 16:53
?9次下載
什么是狀態機?狀態機的種類與實現
狀態機,又稱有限狀態機(Finite State Machine,FSM)或米利狀態機(Mealy Machine),是一種描述系統狀態變化的模型。在芯片設計中,
評論