通信設計中考慮協議的靈活性,經常把協議設計成“不定長度”。一個實例如下圖:銳米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文章
486瀏覽量
27234 -
數據幀
+關注
關注
0文章
33瀏覽量
6654 -
csdn
+關注
關注
2文章
16瀏覽量
6820
原文標題:狀態機”來解析UART不定長度的協議幀
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
狀態機編程
狀態機編程基于狀態機的按鍵輸入軟件接口設計一般的教課書中給出的按鍵輸入軟件接口程序通常非常簡單,在程序中一旦檢測到按鍵輸入口為低電平時(圖9-2),便采用(調用)軟件延時程序延時10ms。然后再
發表于 07-10 18:00
如何寫好狀態機
一篇經典文獻,詳細講解了一段、兩段、三段式狀態機的實現,效率、優缺點??赐旰笙嘈艜?b class='flag-5'>狀態機有一個詳細的了解。 狀態機是邏輯設計的重要內容,狀態機的設計水平直接反應工程師的邏輯功底,所以
發表于 10-24 11:43
raw os 之狀態機編程
事件的操作系統QP 具有異曲同工之妙。狀態機編程的其中一個優勢是所有的任務可以共享一個棧,這樣可以避免傳統的操作系統一個任務一個??臻g的局限。所以能普遍被資源短缺的單片機系統采用,另外一個優勢是面對復雜
發表于 02-27 14:35
狀態機問題
fpga中傳輸數據流,幀格式的,每行有起始字節(SAV)和終止字節(EAV),其實就是BT656格式的,如何寫狀態機判斷數據流傳輸過程中被中斷了?求給個思路
發表于 08-20 17:33
ISR狀態機超時
大家好,芯片是PIC18F46K22,使用XC8編譯器。我在UART RX中斷處理程序中有一個簡單的狀態機。它每隔幾秒鐘從另一個設備接收一個10字節的數據包。我想檢測另一個設備不發送完整的10字節
發表于 11-27 15:05
什么是狀態機
一. 什么是狀態機我們以生活中的小區的停車系統為例:停車桿一般沒車的是不動的(初態),有車來的時候需要抬桿(狀態1),車通過需要放桿(狀態2),如果在放桿的過程中突然有車,又需要抬桿(狀態
發表于 01-06 08:01
什么是狀態機
目錄1 前言2 狀態機2.1 什么是狀態機2.2 狀態機的概念2.3 使用狀態機寫鍵盤的思路3 代碼實例3.1 使用軟件3.2 protues電路圖3.2
發表于 01-24 06:23
什么是狀態機?狀態機5要素
玩單片機還可以,各個外設也都會驅動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態機編程、分層思想
什么是狀態機?狀態機的種類與實現
狀態機,又稱有限狀態機(Finite State Machine,FSM)或米利狀態機(Mealy Machine),是一種描述系統狀態變化的模型。在芯片設計中,
評論