当前位置:网站首页>高效,可靠,安全的串口通讯开源方案
高效,可靠,安全的串口通讯开源方案
2022-07-26 05:25:00 【小麦大叔】
大家好,我是小麦。
在嵌入式开发中,经常会用到串口通讯。面对不同应用场景,需要不同的方案。
今天我们来讲一下高效,可靠,安全的方案,记得看到最后,会有收获。
常见的有串口轮询模式,串口中断模式,串口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事件。
所以无法处理这种情况,即DMA缓冲区处于环形模式(Circular)的时候,数据覆盖的问题,最近看到了一个非常棒的开源项目,这里的思路非常不错,下面会详细介绍。
下面是DMA HC/DMA TC/Idle组合进行串口接收的细节,如下图所示;

再次简单介绍一下缩略词的含义;
R读取;W写入;I空闲信号;HTHalf-Transfer complete DMA缓冲区半传输完成;TCTransfer-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 : )
往期推荐
边栏推荐
猜你喜欢

Common modules in ansible

High frequency electronic circuit review examination questions and answers

ALV program collection

LeetCode链表问题——206.反转链表(一题一文学会链表)

NetCore MySql The user specified as a definer (‘admin‘@‘%‘) does not exist

OD-Paper【2】:Fast R-CNN

no networks found in /etc/cni/net.d

MySQL master-slave synchronization and master-slave synchronization delay solution

DOM事件流 事件冒泡-事件捕获-事件委托

OD-Paper【1】:Rich feature hierarchies for accurate object detection and semantic segmentation
随机推荐
家居vr全景展示制作提高客户转化
Simulation of future air pollution changes
OD-Paper【2】:Fast R-CNN
高分子物理知识点
LeetCode链表问题——206.反转链表(一题一文学会链表)
C语言-指针进阶
C language - Advanced pointer
MySQL master-slave synchronization and master-slave synchronization delay solution
Day011 one dimensional array
OD-Paper【1】:Rich feature hierarchies for accurate object detection and semantic segmentation
Mongondb API usage
NPM operation instruction
TZC 1283: simple sort - select sort
Okaleido launched the fusion mining mode, which is the only way for Oka to verify the current output
怎么办理聚合收款码
Three implementation methods of thread and the usage of handler
nn.Moudle模块-创建神经网络结构需要注意的细节
Uniapp applet framework - a set of code, multi segment coverage
35. 搜索插入位置
Nn.moudle module - details of creating neural network structure