在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

如何高效解析不定長度的協議幀?

STM32嵌入式開發 ? 來源:CSDN-RimeLink ? 2023-07-18 16:09 ? 次閱讀

通信設計中考慮協議的靈活性,經常把協議設計成“不定長度”。一個實例如下圖:銳米LoRa終端的通信協議幀。
bc5c5e50-2541-11ee-962d-dac502259ad0.jpg ????

如果一個系統接收上述“不定長度”的協議幀,將會有一個挑戰--如何高效接收與解析。

為簡化系統設計,我們強烈建議您采用“狀態機”來解析UART數據幀,并且把解析工作放在ISR(中斷服務程序)完成,僅當接收到最后一個字節(0x0D)時,再將整個數據幀提交給進程處理。該解析狀態機的原理如下圖所示:
bc6eafba-2541-11ee-962d-dac502259ad0.jpg ????

那么ISR處理這個狀態機來得及嗎?答案是:so easy!因為它只有3個動作,運算量十分?。?br />
比較接收數據 -> 更新狀態變量 -> 存儲接收數據,C語言僅3條語句,翻譯成機器指令也不超過10條。

代碼清單如下:

/**
* @brief  Status of received communication frame
*/
typedef enum
{
    STATUS_IDLE = (uint8_t)0,
    STATUS_HEAD, /* Rx Head=0x3C */
    STATUS_TYPE, /* Rx Type */
    STATUS_DATA, /* Data filed */
    STATUS_TAIL, /* Tail=0x0D */
    STATUS_END, /* End of this frame */
} COMM_TRM_STATUS_TypeDef;


/**
* @brief  Data object for received communication frame
*/
typedef struct
{
    uint8_t    byCnt; /* Count of 1 field */
    uint8_t    byDataLen; /* Length of data field */
    uint8_t    byFrameLen; /* Length of frame */
    COMM_TRM_STATUS_TypeDef    eRxStatus;
    uint8_t    a_byRxBuf[MAX_LEN_COMM_TRM_DATA]; 
} COMM_TRM_DATA;






/**


* @brief  Data object for received communication frame.
* @note  Prevent race condition that accessed by both ISR and process.
*/
static COMM_TRM_DATA    s_stComm2TrmData;






/**
  * @brief  Put a data that received by UART into buffer.
  * @note  Prevent race condition this called by ISR. 
  * @param  uint8_t byData: the data received by UART.
  * @retval  None
  */
void comm2trm_RxUartData(uint8_t byData)
{
    /* Update status according to the received data */
    switch (s_stComm2TrmData.eRxStatus)
    {
        case STATUS_IDLE:
            if (COMM_TRM_HEAD == byData) /* Is Head */
            {
                s_stComm2TrmData.eRxStatus = STATUS_HEAD;
            }
            else
            {
                goto rx_exception;
            }
            break;
        case STATUS_HEAD:
            if (TYPE_INVALID_MIN < byData && byData < TYPE_INVALID_MAX) /* Valid type */
            {
                s_stComm2TrmData.eRxStatus = STATUS_TYPE;
            }
            else
            {
                goto rx_exception;
            }
            break;
        case STATUS_TYPE:
            if (byData <= MAX_LEN_UART_FRAME_DATA) /* Valid data size */
            {
                s_stComm2TrmData.eRxStatus = STATUS_DATA;
                s_stComm2TrmData.byDataLen = byData;
            }
            else
            {
                goto rx_exception;
            }
            break;
        case STATUS_DATA:
            if (s_stComm2TrmData.byCnt < s_stComm2TrmData.byDataLen)
            {
                ++s_stComm2TrmData.byCnt;
            }
            else
            {
                s_stComm2TrmData.eRxStatus = STATUS_TAIL;
            }
            break;
        case STATUS_TAIL:
            if (COMM_TRM_TAIL == byData)
            {
                /* We received a frame of data, now tell process to deal with it! */
                process_poll(&Comm2TrmProcess);
            }
            else
            {
                goto rx_exception;
            }
            break;
        default:
            ASSERT(!"Error: Bad status of comm2trm_RxUartData().
");
            break;
    }


    /* Save the received data */
    s_stComm2TrmData.a_byRxBuf[s_stComm2TrmData.byFrameLen++] = byData;
    return;


rx_exception:
    ClearCommFrame();
    return; 
}

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 通信協議
    +關注

    關注

    28

    文章

    882

    瀏覽量

    40306
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27538
  • 通信設計
    +關注

    關注

    0

    文章

    25

    瀏覽量

    10512
  • LoRa
    +關注

    關注

    349

    文章

    1689

    瀏覽量

    231938

原文標題:如何高效解析不定長度的協議幀?

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    用串口DMA傳輸不定長度包的方式

    經常看到有人在問用DMA接收不定長包的問題,由于STM32DMA的特殊性,使其對接收不定長的數據不太方便,很多人都在為此傷腦筋,也有不少牛人想了不少的辦法,例如用協議或開定時器判別等,其實這些方法都
    發表于 12-26 08:48

    STM32單片機接收不定長度字節數據的方法解析相關資料推薦

    http://m.elecfans.com/article/899756.html今天說一下STM32單片機的接收不定長度字節數據的方法。由于STM32單片機帶IDLE中斷,所以利用這個中斷,可以
    發表于 07-01 09:41

    STM32單片機的接收不定長度字節數據的方法

    STM32串口使用IDLE中斷接收不定長數據原理與源程序轉載 2016年07月16日 18:20:24原文來自 今天說一下STM32單片機的接收不定長度字節數據的方法。由于STM32單片機帶IDLE中斷,所以利用這個中斷,可以接收不定長
    發表于 08-04 09:05

    stm32串口是如何實現接收不定長度數據的呢

    stm32串口是如何實現接收不定長度數據的呢?串口接收數據一般會采用串口中斷方式自動接收,要想接收不定長度數據,就需要讓單片機在接收完成一數據之后,自動告知系統數據已經接收完成了,這個過程其實都是
    發表于 08-11 08:18

    STM32串口接收不定長數據

    STM32串口接收不定長數據->鏈表數據說明二級目錄三級目錄數據說明STM32數據寄存器為USARTx->DR寄存器二級目錄三級目錄
    發表于 12-06 07:05

    STM32 HAL DMA串口接收不定長度的實現方法

    STM32 HAL DMA串口接收不定長度的實現方法
    發表于 12-08 07:59

    STM32 Uart是如何接收不定長度的數據呢

    我們如何確定數據包的長度?STM32 Uart是如何接收不定長度的數據呢?
    發表于 12-09 06:12

    STM32單片機的接收不定長度字節數據的方法

    來說一下STM32單片機的接收不定長度字節數據的方法。由于STM32單片機帶IDLE中斷,所以利用這個中斷,可以接收不定長字節的數據,由于STM32屬于ARM單片機,所以這篇文章的方法也適合其他
    發表于 01-06 08:04

    利用STM32F1的串口空閑中斷實現不定長的數據斷

    常見的數據方式有兩種,一種是通過固定的協議格式斷,另外一個是通過兩幀數據的時間斷,下面介紹最后一種,利用STM32F1的串口空閑中
    發表于 02-17 07:55

    C語言中怎么定義一個不定長度的數組?

    C語言中怎么定義一個不定長度的數組
    發表于 10-09 07:40

    LoRa終端通信設計中應該考慮的協議靈活性

    通信設計中考慮協議的靈活性,經常把協議設計成“不定長度”。一個實例如下圖:銳米LoRa終端的通信協議。
    發表于 07-03 09:54 ?2458次閱讀
    LoRa終端通信設計中應該考慮的<b class='flag-5'>協議</b>靈活性

    STM32串口通信 (采用鏈表接收不定長數據)

    STM32串口接收不定長數據->鏈表數據說明二級目錄三級目錄數據說明STM32數據寄存器為USARTx->DR寄存器二級目錄三級目錄
    發表于 11-23 18:07 ?30次下載
    STM32串口通信 (采用鏈表接收<b class='flag-5'>不定長</b>數據<b class='flag-5'>幀</b>)

    stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

    ,那么stm32串口是如何實現接收不定長度數據的呢? 串口接收數據一般會采用串口中斷方式自動接收,要想接收不定長度數據,就需要讓單片機在接收完成一數據之后,自動告知系統數據已經接收完成了,這個過程其實
    發表于 12-23 19:09 ?27次下載
    stm32 串口接收<b class='flag-5'>不定長度</b>數據及黏包處理 + 串口DMA接收

    單片機的通信協議該如何設計

    ????通信設計中考慮協議的靈活性,經常把協議設計成“不定長度”。 一個實例如下圖:銳米LoRa終端的通信協議。 ????如果一個系統接收
    的頭像 發表于 07-05 17:19 ?2147次閱讀

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

    如果一個系統接收上述“不定長度”的協議,將會有一個挑戰--如何高效接收與解析。 為簡化系統設計,我們強烈建議您采用“狀態機”來
    的頭像 發表于 03-25 14:29 ?695次閱讀
    如何采用“狀態機”<b class='flag-5'>解析</b>UART數據<b class='flag-5'>幀</b>
    主站蜘蛛池模板: 成年女人毛片免费视频 | 欧美午夜视频在线观看 | 夜夜春宵翁熄性放纵30 | 国产精品一区电影 | 高h视频网站| 四虎在线观看一区二区 | 男人j进人女人j 的视频 | 午夜伦伦 | 狠狠色噜噜狠狠狠97影音先锋 | 99热色| 日韩欧美视频在线一区二区 | ww欧洲ww在线视频免费观看 | 欧美成人午夜片一一在线观看 | 亚洲网色 | 国产精品久久自在自2021 | 色视频网站在线观看 | 久青草久青草高清在线播放 | 久久国产精品免费观看 | 男人的j桶女人的j视频 | 人人澡 人人澡 人人看 | 久久婷婷色| 波多野结衣的毛片 | 无遮挡很污很爽很黄的网站 | 美国一级毛片片aa久久综合 | 免费黄视频网站 | 免费国产不卡午夜福在线观看 | 护士巨好爽好大乳 | 99综合在线 | 美女黄18以下禁止观看的网站 | 大看蕉a在线观看 | 欧美精品久久天天躁 | 毛片的网站 | 成人午夜免费视频毛片 | 国产小视频在线播放 | 亚洲黄色网址 | 国产高清精品自在久久 | 天天天天操 | 四虎影裤 | 97久久综合区小说区图片专区 | 国产一卡二卡3卡4卡四卡在线 | 久久久夜夜夜 |