色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

如何高效解析不定長度的協(xié)議幀?

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

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

如果一個系統(tǒng)接收上述“不定長度”的協(xié)議幀,將會有一個挑戰(zhàn)--如何高效接收與解析。

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

那么ISR處理這個狀態(tài)機來得及嗎?答案是:so easy!因為它只有3個動作,運算量十分小:

比較接收數(shù)據 -> 更新狀態(tài)變量 -> 存儲接收數(shù)據,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; 
}

審核編輯:湯梓紅

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

    關注

    28

    文章

    911

    瀏覽量

    40383
  • 狀態(tài)機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27615
  • 通信設計
    +關注

    關注

    0

    文章

    25

    瀏覽量

    10535
  • LoRa
    +關注

    關注

    349

    文章

    1700

    瀏覽量

    232208

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

    STM32單片機的接收不定長度字節(jié)數(shù)據的方法

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

    stm32串口是如何實現(xiàn)接收不定長度數(shù)據的呢

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

    STM32串口接收不定長數(shù)據

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

    STM32 HAL DMA串口接收不定長度的實現(xiàn)方法

    STM32 HAL DMA串口接收不定長度的實現(xiàn)方法
    發(fā)表于 12-08 07:59

    STM32 Uart是如何接收不定長度的數(shù)據呢

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

    STM32單片機的接收不定長度字節(jié)數(shù)據的方法

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

    利用STM32F1的串口空閑中斷實現(xiàn)不定長的數(shù)據斷

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

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

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

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

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

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

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

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

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

    單片機的通信協(xié)議該如何設計

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

    如何采用“狀態(tài)機”解析UART數(shù)據

    如果一個系統(tǒng)接收上述“不定長度”的協(xié)議,將會有一個挑戰(zhàn)--如何高效接收與解析。 為簡化系統(tǒng)設計,我們強烈建議您采用“狀態(tài)機”來
    的頭像 發(fā)表于 03-25 14:29 ?770次閱讀
    如何采用“狀態(tài)機”<b class='flag-5'>解析</b>UART數(shù)據<b class='flag-5'>幀</b>
    主站蜘蛛池模板: 扒开老师粉嫩的泬10P | 99久久免热在线观看 | 99久久国产露脸精品国产吴梦梦 | 秘密教学93话恩爱久等了免费 | 色婷婷激情AV精品影院 | 乱精品一区字幕二区 | 在线观看视频中文字幕 | 春水福利app导航 | 99香蕉视频| 亚洲伊人成综合人影院 | 免费看欧美一级特黄a大片 免费看欧美xxx片 | 亚洲欧美成人在线 | 欧美一区二区三区播放 | 国产色精品久久人妻无码 | 在线不卡日本v二区到六区 在线不卡日本v二区 | 深夜草逼逼 | 精品免费久久久久久影院 | 午夜男女爽爽羞羞影院在线观看 | 手机看片成人 | 免费看a毛片 | 一一本之道高清视频在线观看中文字幕 | 久久er99热精品一区二区 | 日本久久频这里精品99 | 久久夜色撩人精品国产 | 日本韩国欧美一区 | 毛片手机在线 | 国产成人AV永久免费观看 | 欧洲-级毛片内射八十老太婆 | AV天堂午夜精品蜜臀AV | 哇嘎在线精品视频在线观看 | 日本午夜看x费免 | 男人插女人逼逼 | 四虎免费影院 | 久久两性视频 | 男人插曲女人身体视频 | 97无码欧美熟妇人妻蜜 | 亚洲欧美日韩另类精品一区二区三区 | 4480yy午夜私人影院 | 蜜桃成熟时2电影免费观看d | 国产九色在线 | 一抽一出BGM免费3分钟 |