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嵌入式开发】欢迎添加关注!文章转载请注明出处。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6068

    文章

    45032

    浏览量

    652238
  • 通信协议
    +关注

    关注

    28

    文章

    1037

    浏览量

    41253
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Modbus 转 Profinet:工业通信协议的桥梁

    1. 引言 在工业自动化领域,Modbus 和 Profinet 是两种广泛使用的通信协议。Modbus 是一种串行通信协议,常用于连接工业电子设备,而 Profinet 是一种基于以太网的工业
    的头像 发表于 02-24 11:11 ?389次阅读
    Modbus 转 Profinet:工业<b class='flag-5'>通信协议</b>的桥梁

    PCM4201与DSP之间的通信协议是什么?

    关于PCM4201 与 DSP 之间的通信协议
    发表于 02-08 08:17

    Dali通信的工作原理 如何使用Dali通信协议

    一、引言 Dali(Digital Addressable Lighting Interface,数字可寻址照明接口)是一种用于照明控制产品之间双向通信协议。通过Dali通信协议,可以实现对照
    的头像 发表于 01-31 10:33 ?2191次阅读

    详解REST API通信协议

    的一环。 为了实现这一目标,我们采用了多种通信协议,包括MQTT、OPC UA、AMQP和REST API,它们共同构成了智能通信的坚实基础。本期内容,让我们聚焦REST API通信协议,探索它如何在IIoT领域中发挥关键作用。
    的头像 发表于 01-17 12:40 ?1119次阅读
    详解REST API<b class='flag-5'>通信协议</b>

    总线通信协议解析及应用

    在现代计算机系统中,总线通信协议扮演着至关重要的角色。它们定义了数据如何在处理器、内存、输入/输出设备等组件之间传输。 总线通信协议的基本概念 总线通信协议是一组规则,它规定了数据在系统总线上的传输
    的头像 发表于 12-31 10:07 ?1119次阅读

    常见串口通信协议 如何设置串口参数

    串口通信是一种常见的通信方式,广泛应用于计算机、嵌入式系统和各种电子设备之间。串口通信协议主要是指在串行通信中,数据传输的格式和规则。 常见串口通信
    的头像 发表于 12-27 09:51 ?3571次阅读

    AUTOSAR通信协议解析 如何实现AUTOSAR通信

    通信协议栈是一个复杂的系统,它涵盖了多种通信方式和模块,以实现车内ECU之间的高效、可靠的数据交换。以下是对AUTOSAR通信协议的解析及实现AUTOSAR通信的方法: 一、AUTOS
    的头像 发表于 12-17 14:54 ?2974次阅读

    上位通信协议详解 嵌入式上位机设计流程

    上位通信协议详解 上位通信协议是指上位(通常是指具有强大计算能力和数据处理能力的计算机系统)与下位
    的头像 发表于 12-04 10:21 ?3093次阅读

    请问各位大佬AFE4900 EVM的通信协议是什么?

    想用AFE4900EVM自己开发一个软件用于测试,Ti自己的GUI有些功能不能满足。请问各位大佬AFE4900 EVM的通信协议是什么?有没有文件
    发表于 11-29 09:07

    串口通信协议解析 串口通信应用实例

    串口通信协议解析 串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。以下是串口通信协议的介绍: 基本概念
    的头像 发表于 11-21 17:03 ?2245次阅读

    PLC控制系统的通信协议解析

    在现代工业自动化中,PLC控制系统扮演着至关重要的角色。它们不仅需要处理复杂的逻辑控制任务,还需要与其他系统和设备进行通信。为了实现这一目标,PLC系统必须遵循一系列的通信协议。 PLC通信协议
    的头像 发表于 11-08 09:46 ?2699次阅读

    如何实现51单片机与PC的串行通信

    51单片机与PC的串行通信是一种常见的通信方式,它允许单片机通过串行接口与PC进行数据交换。
    的头像 发表于 10-21 11:35 ?2734次阅读

    PROFINET通信协议是什么

    PROFINET通信协议是一种专为工业自动化领域设计的基于以太网的实时通信协议。以下是对PROFINET通信协议的详细解析,包括其定义、特点、体系结构、工作原理、通信方式、应用领域以及
    的头像 发表于 09-25 18:13 ?5285次阅读

    dht11采用什么通信协议

    DHT11是一款广泛使用的温湿度传感器,它通过简单的数字接口与微控制器或其他数字设备进行通信。DHT11使用单总线通信协议,这意味着所有的数据传输都通过单一的数据线完成。这种通信方式简单且成本低
    的头像 发表于 09-04 09:06 ?5666次阅读

    #单片机 #人工智能 #pcb设计 #通信协议

    通信协议
    深圳市北天通讯有限公司
    发布于 :2024年09月03日 09:27:07