<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何采用“狀態機”解析UART數據幀

嵌入式情報局 ? 來源:csdn ? 2024-03-25 14:29 ? 次閱讀

通信設計中考慮協議的靈活性,經常把協議設計成“不定長度”。一個實例如下圖:銳米LoRa終端的通信協議幀。

f914fa00-e855-11ee-a297-92fbcf53809c.jpg

如果一個系統接收上述“不定長度”的協議幀,將會有一個挑戰--如何高效接收與解析。 為簡化系統設計,我們強烈建議您采用“狀態機”來解析UART數據幀,并且把解析工作放在ISR(中斷服務程序)完成,僅當接收到最后一個字節(0x0D)時,再將整個數據幀提交給進程處理。 該解析狀態機的原理如下圖所示:

f91c6556-e855-11ee-a297-92fbcf53809c.jpg

那么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不定長度的協議幀

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    采用米利型的狀態機電路設計

    首先可以確定采用米利型狀態機設計該電路。因為該電路在連續收到信號0101時,輸出為1,其他情況下輸出為0,所以采用米利型狀態機。
    的頭像 發表于 09-08 14:06 ?7616次閱讀
    <b class='flag-5'>采用</b>米利型的<b class='flag-5'>狀態機</b>電路設計

    狀態機編程

    狀態機編程基于狀態機的按鍵輸入軟件接口設計一般的教課書中給出的按鍵輸入軟件接口程序通常非常簡單,在程序中一旦檢測到按鍵輸入口為低電平時(圖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

    隊列狀態機

    應用LabView做的連接mdb數據庫,應用隊列狀態機
    發表于 02-05 22:58

    【FPGA】UART內核模塊的狀態機如何設計

    UART 內核模塊的狀態機設計UART 內核模塊的功能是控制數據接收、數據加載和數據發送的過程,
    發表于 10-24 10:06

    ISR狀態機超時

    大家好,芯片是PIC18F46K22,使用XC8編譯器。我在UART RX中斷處理程序中有一個簡單的狀態機。它每隔幾秒鐘從另一個設備接收一個10字節的數據包。我想檢測另一個設備不發送完整的10字節
    發表于 11-27 15:05

    狀態機是什么?什么是消息觸發類型的狀態機?

    狀態機可歸納為哪幾個要素?狀態機可分為哪幾種?什么是消息觸發類型的狀態機?
    發表于 04-19 06:02

    什么是狀態機? 狀態機是如何編程的?

    什么是狀態機?狀態機是如何編程的?
    發表于 10-20 07:43

    什么是狀態機

    一. 什么是狀態機我們以生活中的小區的停車系統為例:停車桿一般沒車的是不動的(初態),有車來的時候需要抬桿(狀態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

    采用狀態機和消息機制的串口接收程序

    采用狀態機和消息機制的串口接收程序
    發表于 05-16 14:51 ?48次下載

    什么是狀態機?狀態機5要素

    玩單片機還可以,各個外設也都會驅動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態機編程、分層思想
    的頭像 發表于 07-27 11:23 ?1.9w次閱讀
    什么是<b class='flag-5'>狀態機</b>?<b class='flag-5'>狀態機</b>5要素

    什么是狀態機?狀態機的種類與實現

    狀態機,又稱有限狀態機(Finite State Machine,FSM)或米利狀態機(Mealy Machine),是一種描述系統狀態變化的模型。在芯片設計中,
    的頭像 發表于 10-19 10:27 ?5739次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>