在线观看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>
    主站蜘蛛池模板: 丁香婷婷在线观看| 亚洲午夜综合网| 手机看片福利1024| 4438x全国免费| 色综合网天天综合色中文男男| 精品手机在线| 亚洲大尺度视频| 激情理论片| 狠狠干最新网址| 中文字幕第五页| 激情亚洲| 黄色三级免费网站| 亚洲合集综合久久性色| 国产三级精品在线观看| 11111日本网站| 91男女视频| 色偷偷91综合久久噜噜| 亚洲午夜影视| 日本一区免费观看| 美女黄网站| se94se欧美| 成人啪啪免费视频| 日韩一级生活片| 天天做天天爱天天做天天吃中| 一区二区不卡视频| 欧美日韩一级视频| 人人干狠狠操| 在线视频这里只有精品| 国产福利网站| 夜夜狠狠| 久久久五月| 亚洲人成网站色7799在线观看| 久久久久国产成人精品亚洲午夜| 四虎在线播放免费永久视频| 亚洲第一成网站| 免费在线观看一区二区| 黄色自拍偷拍| h在线观看免费| 久久久99精品免费观看精品| 8050午夜| 香港三级理论在线影院|