51单片机实现通讯协议的串口通讯编程

时间:2023-03-05作者:佚名

我们以51单片机为例。51中一般针对串口通讯编程,通常采取中断接受查询发送的方式。中断函数在接受数据到达时被重复调用,其实是个重复入栈的过程,所以不宜将函数写的太长,函数太长一般会导致栈太深占用系统资源,二是处理时间过长,可能导致通讯出错。为了防止在处理数据过程中不受干扰,通常在处理接受数据前关闭中断,处理完后再开。

通常的的编程方式如下:

STatic void UartInterruptService(void) interrupt 4

{

ES = 0;

RI = 0;

uart_process(SBUF);

ES=1;

}

下面重点介绍数据处理函数 uart_process(SBUF);

其实很多时候,对于通讯传输的数据处理才是关键,尤其对于设计通讯协议而言。笔者在刚刚做的一个系统上就碰到这样的问题,当系统庞大了,资源十分有限的情况下,数据处理一旦占用资源太多,效率太低将导致系统崩溃而无法运行。

到了这里,很多工程师可能会考虑开个大的缓冲区FIFO将接收到的数据保存在缓冲区,然后对其进行解析、判断进行下一步程序编写,当然这在系统资源比较丰富的情况下是没有问题的,ARM上采取的就是这样的方式。但如何系统庞大呢,留给的资源缺乏则不行。这样做的一个很大缺点必须是将数据帧接收完了才能够判断,降低了效率和运行速度。

其实还有另外的方式,可以采取在每接收一个字节就对其解析,解析完判断转到下一个状态,并将其中的有用数据存储在相应的数据结构中去,可以采取状态机实现。

将状态机设计为两个控制状态,一是串口状态——uart_state ,一是命令类型状态——CMD_state 。

51单片机实现通讯协议的串口通讯编程

(1)状态机开始状态:串口状态为CMD_NO

(2)接受到STX_CMD,状态变为CMD_START.

(3)接下来将自动进入接受命令帧的状态,再开启命令状态的状态机,对发送来的有用数据进行解析,保存,校验等。处理完毕后将uart_state设为CMD_END状态进行下一步的接受完毕判断,将cmd_state设置为初始的NO_CMD状态。

(4)最后进行ETX_CMD判断,判断数据接收是否完毕。

void uart_process(U8 u8)

{

if(uart_state == CMD_NO)

{

if(u8 == STX_CMD)

{

uart_state = CMD_START;

}

}

else if(uart_state == CMD_START)

{

switch(cmd_state)

{

case NO_CMD:

cmd_state = u8;

break;

case COST_CMD:

//解析存储有用数据到相应数据结构中

//进行CRC校验

……

uart_state = CMD_END;

cmd_state = NO_CMD;

CRC = 0;

break;

……

}

……

}

else if(uart_state == CMD_END)

{

uart_state = CMD_NO;

if(u8 == ETX_CMD)

{

//接受完毕

//可以考虑抛出一个消息main函数循环中进行响应处理。

}

}

}

接下来我们要讨论解析后我们数据存储的问题,其实在资源比较足够的情况下或者能够挤出data区的情况下可以考虑用结构体,我们构造好相应结构体,将接收到的数据存储进去,要应用的时候就十分方便。但这也有个矛盾,一般c51定义的结构体都被存储在data区,一般通讯的字节量大空间必然不够,存在一个矛盾,可以采用联合体union进行存储效果会好一点。当然也可以在保存数据时采用定义在xdata区(片外)的buffer来存储。这样在一定程序上优化了程序的执行效率,在程序处理立即抛出消息处理,提高了通讯数据的处理速度。对于通常资源比较丰富的系统,比如ARM上一般采取的做法是这样的,将数据存在缓冲区,接收完一帧数据后再转换成相应的数据结构,再进行分析、校验。

总体来说,这种采取状态机实时解析串口通讯数据的方式在一定程序提高了程序运行效率,使软件架构清晰明了,程序可扩展性大,有利于后续开发。

相关阅读

简单的双向对讲机电路原理图讲解

如果您需要定期起床与办公室里的某人通话,那么这款双向对讲机可能会节省您的时间。要进行通信,只需从两侧打开它即可。如果您家里有人患有新冠病毒,它也会很有用。图 1 显示...
2023-07-31
简单的双向对讲机电路原理图讲解

LM139引脚图和电路图讲解

LM139 主要是以下几个方面: 1、LM139是什么芯片? 2、LM139 引脚图及功能 3、LM139 CAD模型 4、LM139芯片介绍 5、LM139电路图讲解                                                      ...
2023-07-06
LM139引脚图和电路图讲解

什么是环网柜?为什么一般住宅高压供电宜采用环网供电方式?

环网电压集中供电方式的核心是多支路分束供电,由主变电所35kV母线分别引出几个供电支路,每个支路可挂接3个左右的牵引降压变电所;有来自不同变电所的两个支路通过分段开关互...
2023-06-11
什么是环网柜?为什么一般住宅高压供电宜采用环网供电方式?

MLCC电极用超细铜粉的制备工艺

MLCC电极用金属粉末的技术要求 为了满足MLCC电极使用要求,金属粉末应具有以下性能特点: 1)所用金属颗粒熔点要高(1000℃以上),以防止与陶瓷介质同时烧结时发生金属粉末的熔化...
2023-03-31
MLCC电极用超细铜粉的制备工艺

智能手机中钽电容的替换方案

1.评估对象 对市场上出售的智能手机进行评估,其中电池电路配线图的一部分如下图所示,是我们自行解析的结果。 Ta电容器连接在GSM用PA的电源附近。 2.Ta电容器的替换方案 我们提出...
2023-08-09
智能手机中钽电容的替换方案

热销商品

连发瓦斯枪通用瓦斯射钉钢钉枪瓦斯气体高强度瓦斯射钉枪165气罐

连发瓦斯枪是一款专为高强度瓦斯射钉设计的工具,其特点在于能够连续发射瓦斯气体,适用于多种需要快速穿透和固定材料的场景。这款瓦斯枪配备了165气罐,容量足够满足...
4.5

黄铜镀镍金属电缆防水接头EWM密封格兰头HSM电线固定填料函M20M16

黄铜镀镍金属电缆防水接头EWM密封格兰头(HSM型)是一款高性能电线固定与密封装置,适用于M16和M20螺纹规格。采用优质黄铜材质并表面镀镍处理,具备优异的防腐蚀性、机械...
1.14

消防配件二氧化碳灭火器2 3 5 7KG弯头喷管24Kg干冰CO2外喷头喷嘴

二氧化碳灭火器配件中的2357KG弯头喷管与24Kg干冰CO₂外喷头喷嘴,是专业消防设备的重要组成部分。该弯头喷管采用高强度耐腐蚀材料制造,连接灵活,适用于高压CO₂灭火...
4.5

雷士照明led筒灯孔灯客厅吊顶天花灯嵌入式过道筒灯射灯桶灯家用

雷士照明LED筒灯是一款专为现代家居设计的嵌入式照明产品,适用于客厅、吊顶、过道、卧室等空间。采用高品质LED光源,光线柔和均匀,显色指数高,有效还原真实色彩,营造舒...
5.78

雷士照明嵌入式防眩筒灯射灯窄边过道灯深杯客厅无主灯天花灯米雪

雷士照明嵌入式防眩筒灯射灯——“米雪”系列,专为现代无主灯设计打造。采用窄边深杯结构,有效控制杂散光,实现精准防眩,营造舒适柔和的光环境。适用于客厅、过道、天...
25.67

网站栏目