通信设计中考虑协议的灵活性,经常把协议设计成“不定长度”。
一个实例如下图:锐米LoRa终端的通信协议帧。
如果一个系统接收上述“不定长度”的协议帧,将会有一个挑战--如何高效接收与解析。
为简化系统设计,我们强烈建议您采用“状态机”来解析UART数据帧,并且把解析工作放在ISR(中断服务程序)完成,仅当接收到最后一个字节(0x0D)时,再将整个数据帧提交给进程处理。
该解析状态机的原理如下图所示:
那么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
审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6001文章
43973浏览量
620826 -
通信协议
+关注
关注
28文章
737浏览量
39745
发布评论请先 登录
相关推荐
工业控制通信协议的报文帧分别是什么样的?
通信协议的设备上,有什么调试测试软件推荐,尽量不要借助硬件设备,直接使用上位机和支持该协议的设备相连接,直接发送帧读写参数?最常见的协议就是
发表于 01-19 14:46
单片机串口通信的接收与发送程序
等功能。本文将详细介绍单片机串口通信的接收与发送程序。 二、串口通信基础 串口通信协议:串口通信通常采用RS-232、RS-485、SPI等
ad7779数据输出接口和单片机该怎样连接?采用哪种通信协议来接收数据?
AD7779有两种不同接口:SPI和数据输出接口。问题1:数据输出接口和单片机该怎样连接,到底采用哪种通信协议来接收数据?I/O口?USART?SPI?或者说是并口协议。还是说主控芯片
发表于 12-07 07:42
基于PIC16F877A单片机的自定义无线传输协议和短信通信协议
电子发烧友网站提供《基于PIC16F877A单片机的自定义无线传输协议和短信通信协议.pdf》资料免费下载
发表于 11-08 14:47
•1次下载
浅谈Modbus通信协议
Modbus通信协议是一种工业现场总线协议标准,常用的Modbus协议有以下三种类型:Modbus TCP、Modbus RTU、Modbus ASCll。
发表于 09-20 15:56
•959次阅读
IP地址、端口号、通信协议的相关知识 TCP和UDP通信协议简述
网络编程有三个要素,分别是IP地址、端口号和通信协议。本文主要讲述的是TCP与UDP这两种通信协议,以及编程的实现。首先,我们需要了解一下IP地址、端口号、通信协议的相关知识。
单片机通信协议有哪些 单片机和wifi模块间怎么通信
单片机和WiFi模块通信的方法有以下几种: 1. 串口通信:将单片机与WiFi模块通过串口连接,单片机通过串口发送命令给WiFi模块,模块接
通信协议的作用、类型及优缺点
通信协议是指在计算机网络中,为了使不同的计算机或网络设备之间能够相互通信而制定的一套规则和标准。通信协议规定了数据传输的格式、传输速率、传输控制、错误检测和纠正等方面的内容,以确保数据能够正确、高效地传输。常见的
发表于 05-10 16:09
•2997次阅读
通信协议的特点
通信协议的种类和特点目前常见的通信协议主要有:NetBEUI、IPX/SPX、NWLink、TCP/IP,在这几种协议中用得最多、最为复杂的当然还是TCP/IP协议,最为简单的是Net
发表于 05-06 14:57
•985次阅读
通信协议内容与功能
通信协议不难理解,就是两个(或多个)设备之间进行通信,必须要遵循的一种协议。通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过
发表于 05-06 14:43
•2124次阅读
常用的通信协议有哪些
通信协议(communications protocol)官方给出的定义是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序
发表于 05-06 14:36
•1.6w次阅读
通信协议的概念
通信协议是指在通信过程中,为了使得不同设备之间进行有效的数据交换,所约定的一整套规则和标准。通信协议中定义了通信双方的接口、数据格式、传输速率、传输控制和数据处理等细节,从而确保了
发表于 05-06 14:32
•1447次阅读
浅析ModBus通信协议的相关知识
概 述
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus
发表于 05-05 15:51
评论