当前位置:网站首页>高效,可靠,安全的串口通讯开源方案
高效,可靠,安全的串口通讯开源方案
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 : )
往期推荐
边栏推荐
- OD-Paper【2】:Fast R-CNN
- Nn.moudle module - details of creating neural network structure
- SIP账号注册的SIP软电话的使用和常见问题
- Do you really understand fiddler, a necessary tool for testing?
- C语言详解系列——函数的认识(3)形参,实参,嵌套调用和链式访问
- C语言力扣第42题之接雨水。四种方法——暴力、动态规划、栈、双指针
- Week 6 Learning Representation: Word Embedding (symbolic →numeric)
- no networks found in /etc/cni/net.d
- 虚拟偶像代言产品出问题谁负责? 且听律师分析
- Mongondb API usage
猜你喜欢

Attack and defense world flatscience

攻防世界--easy_web

FPGA刷题——序列检测

LAMP架构

高频电子线路复习考试题及答案

High frequency electronic circuit review examination questions and answers

如何从内存解析的角度理解“数组名实质是一个地址”?
C语言详解系列——函数的认识(3)形参,实参,嵌套调用和链式访问

No background, no education? Is it really hopeless for specialist testers to enter Internet factories?

Shell process control (emphasis), if judgment, case statement, let usage, for ((initial value; loop control condition; variable change)) and for variable in value 1 value 2 value 3..., while loop
随机推荐
ABAP语法学习(ALV)
TZC 1283: simple sort - Comparative sort
No EGL Display 报错解决
NPM operation instruction
如何从内存解析的角度理解“数组名实质是一个地址”?
SQL注入
ABAP grammar learning (ALV)
Shell read read console input, use of read
Improve reduce parallelism in shuffle operation
517. Super washing machine
怎么办理聚合收款码
C language - Advanced pointer
Reason for pilot importerror: cannot import name 'pilot_ Version 'from' PIL ', how to install pilot < 7.0.0
Mysql优化
SSTI payload and various bypass methods
Mongondb API usage
Embedded sharing collection 20
C语言力扣第42题之接雨水。四种方法——暴力、动态规划、栈、双指针
真正的科学减肥
ALV入门