91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)的通信協(xié)議該如何設(shè)計(jì)

STM32嵌入式開發(fā) ? 來源:STM32嵌入式開發(fā) ? 作者:STM32嵌入式開發(fā) ? 2022-07-05 17:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

通信設(shè)計(jì)中考慮協(xié)議的靈活性,經(jīng)常把協(xié)議設(shè)計(jì)成“不定長度”。

一個(gè)實(shí)例如下圖:銳米LoRa終端的通信協(xié)議幀。

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

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

為簡化系統(tǒng)設(shè)計(jì),我們強(qiáng)烈建議您采用“狀態(tài)機(jī)”來解析UART數(shù)據(jù)幀,并且把解析工作放在ISR(中斷服務(wù)程序)完成,僅當(dāng)接收到最后一個(gè)字節(jié)(0x0D)時(shí),再將整個(gè)數(shù)據(jù)幀提交給進(jìn)程處理。

該解析狀態(tài)機(jī)的原理如下圖所示:

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

那么ISR處理這個(gè)狀態(tài)機(jī)來得及嗎?答案是:so easy!因?yàn)樗挥?個(gè)動(dòng)作,運(yùn)算量十分?。?/span>

比較接收數(shù)據(jù) -> 更新狀態(tài)變量 -> 存儲(chǔ)接收數(shù)據(jù),C語言僅3條語句,翻譯成機(jī)器指令也不超過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

原文標(biāo)題:如何設(shè)計(jì)單片機(jī)的通信協(xié)議?

文章出處:【微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45492

    瀏覽量

    670134
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    1092

    瀏覽量

    42142
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    松下A6伺服通信協(xié)議介紹

    松下A6伺服通信協(xié)議是工業(yè)自動(dòng)化領(lǐng)域中廣泛使用的一種高性能通信標(biāo)準(zhǔn),其設(shè)計(jì)旨在實(shí)現(xiàn)伺服驅(qū)動(dòng)器與控制器之間的高效數(shù)據(jù)交互。協(xié)議基于松下自主開發(fā)的通信
    的頭像 發(fā)表于 03-02 17:16 ?494次閱讀
    松下A6伺服<b class='flag-5'>通信協(xié)議</b>介紹

    重型車輛J1939通信協(xié)議是什么

    重型車輛J1939通信協(xié)議是美國汽車工程師協(xié)會(huì)(SAE)制定的基于控制器局域網(wǎng)(CAN)的高層通信協(xié)議標(biāo)準(zhǔn),主要用于重型車輛及商用車輛中電子控制單元(ECU)之間的實(shí)時(shí)、可靠數(shù)據(jù)交換。 一、協(xié)議背景
    的頭像 發(fā)表于 02-04 17:46 ?1061次閱讀

    機(jī)器人通信協(xié)議EtherCAT和CAN如何選擇

    當(dāng)下,雖然行業(yè)中存在許多通信協(xié)議,但業(yè)內(nèi)人士普遍認(rèn)為,EtherCAT和CAN兩大協(xié)議,是機(jī)器人行業(yè)未來最重要的兩大協(xié)議。
    的頭像 發(fā)表于 01-27 15:54 ?2434次閱讀

    協(xié)議“老將”,連接工業(yè)智能的橋梁——一文讀懂ModBus通信協(xié)議

    一、什么是ModBus? ModBus是一種串行通信協(xié)議,由Modicon公司(現(xiàn)施耐德電氣)于1979年推出,最初用于可編程邏輯控制器(PLC)之間的通信。如今,它已成為工業(yè)自動(dòng)化領(lǐng)域的通信
    發(fā)表于 12-15 10:08

    通信協(xié)議IIC與SPI最全對(duì)比分析

    現(xiàn)今,在低端數(shù)字通信應(yīng)用領(lǐng)域,我們隨處可見IIC(Inter-Integrated Circuit)和 SPI(Serial Peripheral Interface)的身影。原因是這兩種通信協(xié)議
    發(fā)表于 12-10 06:04

    Xilinx FPGA串行通信協(xié)議介紹

    Xilinx FPGA因其高性能和低延遲,常用于串行通信接口設(shè)計(jì)。本文深入分析了Aurora、PCI Express和Serial RapidIO這三種在Xilinx系統(tǒng)設(shè)計(jì)中關(guān)鍵的串行通信協(xié)議。介紹了它們的特性、優(yōu)勢和應(yīng)用場景,以及如何在不同需求下選擇合適的
    的頭像 發(fā)表于 11-14 15:02 ?2529次閱讀
    Xilinx FPGA串行<b class='flag-5'>通信協(xié)議</b>介紹

    如何使用FPGA實(shí)現(xiàn)SRIO通信協(xié)議

    本例程詳細(xì)介紹了如何在FPGA上實(shí)現(xiàn)Serial RapidIO(SRIO)通信協(xié)議,并通過Verilog語言進(jìn)行編程設(shè)計(jì)。SRIO作為一種高速、低延遲的串行互連技術(shù),在高性能計(jì)算和嵌入式系統(tǒng)中廣
    的頭像 發(fā)表于 11-12 14:38 ?5732次閱讀
    如何使用FPGA實(shí)現(xiàn)SRIO<b class='flag-5'>通信協(xié)議</b>

    分布式能源并網(wǎng)的通信協(xié)議有哪些?

    在分布式能源(如光伏、儲(chǔ)能、微電網(wǎng))并網(wǎng)場景中,通信協(xié)議需滿足 設(shè)備互聯(lián)、數(shù)據(jù)傳輸、遠(yuǎn)程控制、調(diào)度協(xié)同 等核心需求,不同協(xié)議因設(shè)計(jì)目標(biāo)不同,適用于從設(shè)備層到調(diào)度層的不同層級(jí)。以下按 “國際標(biāo)準(zhǔn)協(xié)議
    的頭像 發(fā)表于 09-18 16:40 ?1562次閱讀
    分布式能源并網(wǎng)的<b class='flag-5'>通信協(xié)議</b>有哪些?

    工業(yè)通信協(xié)議都有哪些?#三格電子

    通信協(xié)議
    三格電子科技
    發(fā)布于 :2025年08月28日 10:35:26

    哪些協(xié)議是工業(yè)通信協(xié)議?#三格電子

    通信協(xié)議
    三格電子科技
    發(fā)布于 :2025年08月27日 14:16:07

    有哪些方法可以確保硬件加速與通信協(xié)議的兼容性?

    ? 確保硬件加速與通信協(xié)議的兼容性,核心是從 硬件選型、協(xié)議標(biāo)準(zhǔn)匹配、軟硬件接口適配、全場景測試驗(yàn)證 四個(gè)維度建立閉環(huán),避免因硬件功能缺失、接口不兼容或協(xié)議特性支持不全導(dǎo)致的性能損耗、數(shù)據(jù)丟包甚至
    的頭像 發(fā)表于 08-27 10:07 ?1066次閱讀

    怎么測單片機(jī)系統(tǒng)頻率

    單片機(jī)系統(tǒng)頻率是指單片機(jī)工作時(shí)的時(shí)鐘頻率,它直接影響單片機(jī)的運(yùn)行速度和處理能力,準(zhǔn)確測量系統(tǒng)頻率對(duì)單片機(jī)應(yīng)用開發(fā)、程序調(diào)試和性能優(yōu)化具有重要意義。測量
    的頭像 發(fā)表于 07-25 11:39 ?778次閱讀

    HIPERFACE DSL編碼器通信協(xié)議介紹

    在工業(yè)自動(dòng)化和智能制造快速發(fā)展的今天,編碼器在各類設(shè)備中扮演著關(guān)鍵角色,精準(zhǔn)的位置和速度反饋是確保系統(tǒng)高效、穩(wěn)定運(yùn)行的基礎(chǔ)。HIPERFACE DSL作為一種先進(jìn)的編碼器通信協(xié)議,正逐漸成為眾多工業(yè)
    的頭像 發(fā)表于 05-23 14:16 ?2150次閱讀
    HIPERFACE DSL編碼器<b class='flag-5'>通信協(xié)議</b>介紹

    自動(dòng)化通信協(xié)議Profinet轉(zhuǎn)EtherCAT:提升層布貼合效率

    不同的通信協(xié)議。今天,我們將探討開疆智能Profinet轉(zhuǎn)EtherCAT網(wǎng)關(guān)KJ-PN-ECATM及其在層布貼合機(jī)中的應(yīng)用。Profinet是基于以太網(wǎng)的工業(yè)自動(dòng)化通信
    的頭像 發(fā)表于 03-31 10:39 ?671次閱讀
    自動(dòng)化<b class='flag-5'>通信協(xié)議</b>Profinet轉(zhuǎn)EtherCAT:提升層布貼合效率