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上一般采取的做法是这样的,将数据存在缓冲区,接收完一帧数据后再转换成相应的数据结构,再进行分析、校验。

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

相关阅读

如何看懂电气图纸?老师傅手把手教你学习电气图纸,新手必看

电气图定义:用电气图形符号、带注释的围框或简化外形表示电气系统或设备中组成部分之间相互关系及其连接关系的一种图。如何看懂电气图纸?下面将详细为朋友们介绍! 总结:看...
2023-06-11
如何看懂电气图纸?老师傅手把手教你学习电气图纸,新手必看

画好原理图的几个技巧

很多时候原理图不仅仅是给自己看的,也会给其它人看,如果可读性差,会带来一系列沟通问题。 所以,要养成良好习惯,做个规范的原理图。此外,一个优秀的原理图,还会考虑可测...
2023-04-29
画好原理图的几个技巧

电工基础:三相交流电源(37)

【点击领取】 三菱案例 | 西门子案例 | 电工手册 | 工具箱 软件 【点击获取】 三菱PLC例程117个|西门子PLC例程777个 【点击下载】 2020新电工仿真软件 本次文章是 技成培训 杨思慧老师通...
2023-06-27

“电工荒”来袭:行业困境与破局之路

在当今社会,电力如同无形的血脉,支撑着我们生活和生产的方方面面。然而,一个不容忽视的问题正悄然浮现——“电工荒”。曾经看似寻常的电工职业,如今却面临...
2024-09-24
“电工荒”来袭:行业困境与破局之路

LM3900稳压芯片的工作原理和应用电路

 LM3900稳压芯片,主要是以下几个方面: 一、LM3900是什么芯片?     LM3900 由4个独立的双输入内部补偿放大器组成,这些放大器专门设计用于在单电源电压下工作并提供较大的输出电...
2023-07-04
LM3900稳压芯片的工作原理和应用电路

热销商品

四氟包覆/FEP/PTFE包覆胶O型圈全氟醛FFKMO型圈耐化学腐蚀氟胶

四氟包覆(FEP/PTFE)O型圈及全氟醚(FFKM)O型圈是高性能密封解决方案,专为极端化学环境设计。FEP或PTFE包覆氟橡胶(FKM)芯材的O型圈兼具外层优异的耐化学腐蚀性、抗溶胀性...
5

领普E3S/E5配套插座面板86型暗装插座多孔五孔空调无边框家用

领普E3S/E5配套插座面板86型暗装插座多孔五孔空调无边框家用,是一款专为现代家庭设计的多功能插座。该款插座采用86型设计,易于安装和适配各种家用电器,无论是台灯、...
11.9

原装博世角磨机GWS6-100/TWS6600/6700转子定子碳刷齿轮/博士配件

原装博世角磨机GWS6-100/TWS6600/6700系列配件,包括转子、定子、碳刷及齿轮等核心部件,均采用博世原厂高品质材料制造,确保与设备完美匹配,保障运行稳定与高效性能。...
3.5

聚氨酯橡胶缓冲垫弹性套联轴器牛筋柱销减震套垫圈弹性垫缓冲胶垫

聚氨酯橡胶缓冲垫弹性套联轴器中的牛筋柱销减震套、垫圈及弹性垫,是一种高性能减震缓冲元件。采用优质聚氨酯橡胶材料制成,兼具高弹性、耐磨损、抗老化及耐油耐酸碱...
0.27

硅胶垫片/硅胶垫/硅胶垫片圆形/硅胶垫圈/橡胶垫片/氟胶垫片

硅胶垫片(又称硅胶垫、硅胶垫圈)是一种由硅橡胶制成的密封材料,具有优异的耐高低温(-60℃~230℃)、耐老化、绝缘和环保无毒特性,广泛用于食品、医疗、电子及家电等领域...
1

网站栏目