那曲檬骨新材料有限公司

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

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

3天內不再提示

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

STM32嵌入式開發 ? 來源:STM32嵌入式開發 ? 作者:STM32嵌入式開發 ? 2022-07-05 17:19 ? 次閱讀

通信設計中考慮協議的靈活性,經常把協議設計成“不定長度”。

一個實例如下圖:銳米LoRa終端的通信協議幀。

25611622-fc42-11ec-ba43-dac502259ad0.jpg

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

為簡化系統設計,我們強烈建議您采用“狀態機”來解析UART數據幀,并且把解析工作放在ISR(中斷服務程序)完成,僅當接收到最后一個字節(0x0D)時,再將整個數據幀提交給進程處理。

該解析狀態機的原理如下圖所示:

256fb7ae-fc42-11ec-ba43-dac502259ad0.jpg

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

比較接收數據 -> 更新狀態變量 -> 存儲接收數據,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;}

原文:

https://blog.csdn.net/jiangjunjie_2005/article/details/50619884

原文標題:如何設計單片機的通信協議?

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

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

    關注

    6043

    文章

    44621

    瀏覽量

    638587
  • 通信協議
    +關注

    關注

    28

    文章

    915

    瀏覽量

    40441
收藏 人收藏

    評論

    相關推薦

    總線通信協議解析及應用

    在現代計算機系統中,總線通信協議扮演著至關重要的角色。它們定義了數據如何在處理器、內存、輸入/輸出設備等組件之間傳輸。 總線通信協議的基本概念 總線通信協議是一組規則,它規定了數據在系統總線上的傳輸
    的頭像 發表于 12-31 10:07 ?216次閱讀

    常見串口通信協議 如何設置串口參數

    串口通信是一種常見的通信方式,廣泛應用于計算機、嵌入式系統和各種電子設備之間。串口通信協議主要是指在串行通信中,數據傳輸的格式和規則。 常見串口通信
    的頭像 發表于 12-27 09:51 ?718次閱讀

    AUTOSAR通信協議解析 如何實現AUTOSAR通信

    通信協議棧是一個復雜的系統,它涵蓋了多種通信方式和模塊,以實現車內ECU之間的高效、可靠的數據交換。以下是對AUTOSAR通信協議的解析及實現AUTOSAR通信的方法: 一、AUTOS
    的頭像 發表于 12-17 14:54 ?1034次閱讀

    上位通信協議詳解 嵌入式上位機設計流程

    上位通信協議詳解 上位通信協議是指上位(通常是指具有強大計算能力和數據處理能力的計算機系統)與下位
    的頭像 發表于 12-04 10:21 ?1111次閱讀

    串口通信協議解析 串口通信應用實例

    串口通信協議解析 串口通信協議是指規定了數據包的內容,內容包含了起始位、主體數據、校驗位及停止位,雙方需要約定一致的數據包格式才能正常收發數據的有關規范。以下是串口通信協議的介紹: 基本概念
    的頭像 發表于 11-21 17:03 ?714次閱讀

    PLC控制系統的通信協議解析

    在現代工業自動化中,PLC控制系統扮演著至關重要的角色。它們不僅需要處理復雜的邏輯控制任務,還需要與其他系統和設備進行通信。為了實現這一目標,PLC系統必須遵循一系列的通信協議。 PLC通信協議
    的頭像 發表于 11-08 09:46 ?1276次閱讀

    如何實現51單片機與PC的串行通信

    51單片機與PC的串行通信是一種常見的通信方式,它允許單片機通過串行接口與PC進行數據交換。
    的頭像 發表于 10-21 11:35 ?1289次閱讀

    PROFINET通信協議是什么

    PROFINET通信協議是一種專為工業自動化領域設計的基于以太網的實時通信協議。以下是對PROFINET通信協議的詳細解析,包括其定義、特點、體系結構、工作原理、通信方式、應用領域以及
    的頭像 發表于 09-25 18:13 ?2541次閱讀

    #單片機 #人工智能 #pcb設計 #通信協議

    通信協議
    深圳市北天通訊有限公司
    發布于 :2024年09月03日 09:27:07

    簡單認識UART通信協議

    UART(Universal Asynchronous Receiver/Transmitter,通用異步收發傳輸器)通信協議是一種常見的串行通信協議,廣泛應用于計算機、嵌入式系統、傳感器、無線通信
    的頭像 發表于 07-25 18:07 ?1566次閱讀

    說明白了,Modbus RTU通信協議解析-成都電路板單片機開發

    Modbus協議在工業控制、電氣、電子領域是個很常見的一種通信協議,很多遇見的傳感器、控制器、變頻器、驅動器之類的基本都支持協議,常見到什么程度呢,就是你看到的一個設備如果支持串口
    發表于 06-30 22:28

    上位與下位通信協議的優化策略

    在現代工業自動化系統中,上位與下位之間的通信是不可或缺的環節。上位通常指負責監控、管理和控制功能的計算機或設備,而下位則負責執行具體
    的頭像 發表于 06-28 16:36 ?1065次閱讀

    can的通信協議主要由什么完成

    CAN(Controller Area Network)是一種基于消息的通信協議,主要用于汽車和工業領域。它是一種局域網技術,允許多個設備在同一網絡上進行通信。CAN協議的主要特點包括高可靠性、實時
    的頭像 發表于 06-16 10:29 ?683次閱讀

    RS485通信協議的特性和應用范圍

    隨著工業自動化和物聯網技術的飛速發展,數據通信協議的重要性日益凸顯。RS485通信協議作為一種廣泛應用于工業自動化領域的串行通信協議,其穩定性和可靠性得到了廣泛的認可。本文將對RS485通信協
    的頭像 發表于 05-23 16:27 ?1905次閱讀

    UART串口通信協議是什么?

    UART (Universal Asynchronous Receiver/Transmitter) 是一種通信接口協議,用于實現串口通信。它是一種簡單的、可靠的、廣泛應用的串口通信協議
    的頭像 發表于 03-19 17:26 ?1549次閱讀
    A8百家乐官网娱乐平台| 大发888娱乐场下载 zhidu| 百家乐半圆桌| 京城国际| 必博备用| 高要市| 百家乐官网单跳打法| 南安市| 百家乐官网傻瓜式投注法| 宾利百家乐官网现金网| 试用的百家乐软件| 时时博百家乐的玩法技巧和规则 | 太阳城百家乐网址--| 百家乐评级网站| 大家旺百家乐的玩法技巧和规则| 澳门百家乐娱乐场开户注册| 微信百家乐群规则大全| 菲律宾太阳城88| 太阳城网址| 百家乐官网试玩平台| 澳门百家乐官网博彩能做到不输吗| 百家乐官网PK| 百家乐单双打法| 百家乐永利娱乐平台| 威尼斯人娱乐城游戏平台| 百家乐暗红色桌布| 大发888技巧| 香港六合彩开奖号码| 百家乐官网视频打牌| 百家乐官网波音平台开户导航 | 百家乐官网浴盆博彩通排名| 百家乐官网娱乐平台代理佣金 | 德州扑克比赛规则| 百家乐官网缆的打法| 百家乐官网真人游戏赌场娱乐网规则 | 百家乐游戏玩法技巧| 缅甸百家乐视频| 2013现金棋牌游戏| 百家乐官网下载游戏| 真人百家乐官网免费送钱| 百家乐胜率被控制|