大家好,我是小麦。
在嵌入式开发中,经常会用到串口通讯。面对不同应用场景,需要不同的方案。
今天我们来讲一下高效,可靠,安全的方案,记得看到最后,会有收获。
常见的有串口轮询模式,串口中断模式,串口dma接收传输等等;
利用串口的空闲中断配合dma的环形缓冲区模式,可以高效接收不固定长度的消息报文
下图中经过黄色的高电平时间空闲之后,就会产生一个空闲事件,idle event
空闲信号 因为dma功能有hc和tc中断;
hc (harf complete)dma传输一半成功标志; tc (total complete) dma传输完成成功标志; 举个例子;
如下图所示,这里分配了一个dma缓冲区,大小是12字节,如果从地址1开始接收,会出现以下这两种情况;
dma接收到第6个字节的时候,会触发hc事件; dma接收到第12个字节的时候,会触发tc事件; hc tc 这个思路其实我之前也有实践过,但是没有很好地利用hc和tc事件。
所以无法处理这种情况,即dma缓冲区处于环形模式(circular)的时候,数据覆盖的问题,最近看到了一个非常棒的开源项目,这里的思路非常不错,下面会详细介绍。
下面是dma hc/dma tc/idle组合进行串口接收的细节,如下图所示;
来自原项目 再次简单介绍一下缩略词的含义;
r 读取; w 写入; i 空闲信号; ht half-transfer complete dma缓冲区半传输完成; tc transfer-complete dma缓冲区全部接收完成; 这里简单介绍一下情况e的解决方案,上面图片最右边小图;
缓冲区大小20格,这里假设20字节,情况e需要接收30个字节,也就是说,10字节可能会被覆盖;
经过前面的四次接收后,串口继续从字母r处接收数据至dma缓冲区;
接收4字节时,会触发tc事件,这时候可以将4字节数据处理;
第一步 因为是环形模式,所以回到第一个字节处,继续接收10字节,触发ht事件,这时候可以处理10字节数据;
第二步 第三步,继续接收10字节,触发tc事件,其中,已经有4字节被覆盖(下图橙色所示),因为之前这部分数据已经处理了,所以,即使覆盖也不影响;
第三步 第四步,上述已经接收了24个字节,所以还有6个字节没有接收,后面接收会产生空闲信号,并对之前的数据区域进行覆盖,如下图示所示;
所以,不难发现,如果只使用空闲中断,如果需要接收的数据长度大于缓冲区,就会出现数据覆盖的情况,而加上dma的ht和tc中断,就完美解决了这样的问题;
当然除了这些,还有很多优秀的方案,这个项目提供大量的例子。
项目地址:https://github.com/majerle/stm32-usart-uart-dma-rx-tx
项目主页 目前这个项目主要支持主流的stm32芯片平台和一些开发板上的测试demo,具体如下所示;
支持平台 相应的例子程序如下所示,除了裸机程序,还有环形缓冲区接收,轮询接收,dma+空闲中断基于rtos的模式接收,挺丰富的,可以参考一下;
例子程序 作者在 stm32f413-nucleo 开发板进行程序的测试,发现优化效果很不错;
在115200的串口波特率下,每秒发送1581个字节,大约142ms;
不使用dma,cpu负载14%; 使用dma,cpu负载0%; 最后,这个项目目前是基于stm32cubeide创建的,记得搭建一下环境。如果无法下载,公众号后台回复【高效串口】获取项目代码。
enjoy : )
原文标题:高效,可靠,安全的串口通讯开源方案
文章出处:【微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。
9.1.9 共发射极电流增益:复合效应∈《碳化硅技术基本原理——生长、表征、器件和应用》
IIC总线双向电平转换电路的工作原理
丰田正在开发一种先进的辅助机器人
1月份全球机器人技术投资5亿美元,哪个行业获融资最多?
新型光纤激光器,可实现具有可调谐性的单纵模的激光输出
嵌入式开发中串口通讯方案
荧光灯的组成
IDC预测:大陆PC显示器市场将在今年下半年将呈现下降趋势
数据包的过滤、排序和解码
区块链在商业中扮演怎样的角色
旋转LED屏显示控制器设计方案
安防监控设备存储芯片用底部填充胶
基于IrGT700的低功率无线音频应用
数字税将争取今年年中达成相关协议
如何利用物联网技术来管理景区
魅族Flyme6新版发布:升级之后果真不一样了!
国产桌面操作系统开发者平台发布 开放麒麟发力
探讨工业物联网的未来发展脉络
工业平板电脑在生产现场数据采集中的应用
R-Car H2主要特性和系统框图_汽车ADAS入门开发板