历史上的今天
返回首页

历史上的今天

今天是:2025年06月10日(星期二)

正在发生

2020年06月10日 | 51单片机实现通讯协议的串口通讯编程

2020-06-10 来源:elecfans

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


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

推荐阅读

史海拾趣

台湾富晶(FORTUNE)公司的发展小趣事
使用滤波器或隔离器等设备隔离输入信号的干扰。
BERNSTEIN公司的发展小趣事

在BERNSTEIN公司的发展过程中,家族传承和企业管理一直是一个重要的主题。Hans-Joachim Bernstein作为Hans Bernstein的长子,在塑造公司的成功故事中发挥了重要作用。在他的管理下,“SpezialFabrik für Schaltkontakte”公司发展成为当今在国际上活跃的技术集团。这家家族企业现已进入第三代,Nicole和Achim Bernstein作为新一代领导人,继续传承着家族的优良传统和企业文化,推动着公司的持续发展。

CNC Tech公司的发展小趣事

为了进一步扩大市场份额和影响力,CNC Tech公司积极实施全球化战略。公司通过参加国际展会、设立海外分支机构等方式,加强与全球客户的交流与合作。同时,CNC Tech还积极引进国际先进的技术和管理经验,不断提升自身的竞争力。在全球化战略的推动下,CNC Tech的产品和服务逐渐打入国际市场,赢得了全球客户的认可和信赖。

GHz Technology ( Microsemi )公司的发展小趣事

随着科技的不断发展,CNC Tech公司意识到,只有不断创新才能在行业中保持领先地位。因此,公司加大了对研发创新的投入,积极引进和培养高端人才,加强与高校和科研机构的合作。在CNC Tech的努力下,公司成功研发出一系列具有创新性的数控加工技术和产品,不仅提高了生产效率和质量,还降低了生产成本,为客户创造了更大的价值。这些创新成果也引领了行业的技术变革和发展趋势。

DLP Design公司的发展小趣事

DLP绿色科技公司,积极响应国家环保政策,致力于研发和生产绿色环保的DLP技术产品。公司采用先进的生产工艺和材料,降低产品能耗和排放。同时,DLP绿色科技还积极推广节能环保的理念和技术,倡导消费者使用环保产品。通过不懈的努力和实践,DLP绿色科技在电子行业树立了绿色环保的典范形象,为行业的可持续发展做出了积极贡献。

请注意,以上故事均为虚构,旨在展示DLP Design公司在电子行业中的可能发展路径和成就。实际情况可能因公司背景、市场环境等因素而有所不同。

Crystalfontz America Inc公司的发展小趣事

随着公司业务的不断发展壮大,Crystalfontz America Inc公司开始实施全球化战略。公司积极拓展海外市场,通过设立分支机构或建立合作伙伴关系等方式进入更多国家和地区。同时,公司还加强与国际同行的交流与合作,引进先进技术和管理经验,推动公司的全球化发展进程。这些举措为公司带来了更广阔的市场空间和更多的发展机遇。

需要注意的是,以上故事仅为基于公开信息和一般行业趋势的推测性构建,并不代表Crystalfontz America Inc公司的实际发展历程。如果需要了解该公司更具体的发展故事和详细信息,建议查阅相关新闻报道、行业分析报告或联系公司本身以获取更准确的信息。

问答坊 | AI 解惑

11月09日 DIY示波器最新进展(上图)

波形显示界面 引导界面 下面把波形和参数的显示添加进去就可以了,另外一个网友已经做好了,只要把代码合起来这一块就差不多了。 按键也应该快要完成了。模拟通道基本达到预订的效果,昨天休息把两个CPU的通讯协议文本也给做出来了。根 ...…

查看全部问答>

stm32资料 天下第一贴

今天群里有人发了一个 stm资料链接的帖子 “史上最全stm 资料链接,建议将此网页加入收藏夹 http://www.stmsky.com/bbs/viewthread.php?tid=2103&extra=page%3D1 我一看 果然所说不虚 太强了  研讨会资料  pc软件 &nbs ...…

查看全部问答>

硬件高手请进

  有一个32*16 的FIFO 用于视屏采集 现要用DMA 将FIFO数据 按帧(176*144*2 Bytes) 送到SDRAM ,且DMA一帧只启动一次 FIFO深度 不等于 DMA配置传送的长度 这怎么实现DMA不间断传输啊  ???我是做 驱动的 硬件具体实现很 ...…

查看全部问答>

Rensas M16C 如何导出库文件

如题,想研究下更深入的技术. 为提高代码的安全性,如何将程序封装到库文件中呢? 库接口怎么书写,怎么导出,怎么调用? 请高人指教,最好能提供例子.…

查看全部问答>

驱动开发:PCI moden 驱动,多卡工作,求资料....

moden:Conexant CX11252 我是新手,刚转作驱动.....希望高手能提供一些资料,关于moden驱动的开发,给些例子什么的.我想在VC6.0 ddk 下开发..…

查看全部问答>

wince下SQLite连接语句

谁知道wince下SQLite的链接语句啊?…

查看全部问答>

关于统一编址和独立编址的问题

各位大哥:     我的网卡“资源”选项内容如下:“内存范围  EE000000-EE000FFF, 输入/输出范围 C000-C03F 中断请求 11”     请问这样的状况能断定操作系统采用的分别编址模式吗?…

查看全部问答>

请教STM8S-128K和STM8S-32K的区别

在使用STM8S的FWLIB的时候,发现ADC1和USART2不能编译,察看了一下说明文档,有的能够使用在STM8S-32K中,而有的能使用在STM8S-128K中,怀疑ADC1和USART2就是因为只能使用在STM8S-32K中,所以不能编译了。想问一下,这里的32K和128K的区别在于 ...…

查看全部问答>

修改JOYSTICKMOUSE发送数据,前4字节正确后4错误

各位大大,我想问一下,我想修改JOYSTICK MOUSE程序,源程序是一次发送4字节,我想改为发送8字节,可是改完后抓包发现发送的前4个字节是正确的,后四个自己却是错误的,请问为什么? 修改的地方:SetEPTxCount(ENDP1, 8); UserToPMABufferC ...…

查看全部问答>