• 高效,可靠,安全的串口通讯开源方案


    大家好,我是小麦。

    嵌入式开发中,经常会用到串口通讯。面对不同应用场景,需要不同的方案。

    今天我们来讲一下高效,可靠,安全的方案,记得看到最后,会有收获。

    常见的有串口轮询模式,串口中断模式,串口DMA接收传输等等;

    利用串口的空闲中断配合DMA的环形缓冲区模式,可以高效接收不固定长度的消息报文

    下图中经过黄色的高电平时间空闲之后,就会产生一个空闲事件,IDLE EVENT

    fe6183f0c18469773151d057c735685e.png
    空闲信号

    因为DMA功能有HCTC中断

    • HC  (Harf Complete)DMA传输一半成功标志;

    • TC   (Total Complete)  DMA传输完成成功标志;

    举个例子;

    如下图所示,这里分配了一个DMA缓冲区,大小是12字节,如果从地址1开始接收,会出现以下这两种情况;

    • DMA接收到第6个字节的时候,会触发HC事件;

    • DMA接收到第12个字节的时候,会触发TC事件;

    c32a554cf568440536d66221c7593691.png
    HC TC

    这个思路其实我之前也有实践过,但是没有很好地利用HC和TC事件。

    所以无法处理这种情况,即DMA缓冲区处于环形模式(Circular)的时候,数据覆盖的问题,最近看到了一个非常棒的开源项目,这里的思路非常不错,下面会详细介绍。

    下面是DMA HC/DMA TC/Idle组合进行串口接收的细节,如下图所示;

    55510c265ec67054906de3c69c0d50cc.png
    来自原项目

    再次简单介绍一下缩略词的含义;

    • R 读取;

    • W 写入;

    • I 空闲信号;

    • HT Half-Transfer complete DMA缓冲区半传输完成;

    • TC Transfer-Complete DMA缓冲区全部接收完成;

    这里简单介绍一下情况E的解决方案,上面图片最右边小图;

    • 缓冲区大小20格,这里假设20字节,情况E需要接收30个字节,也就是说,10字节可能会被覆盖

    • 经过前面的四次接收后,串口继续从字母R处接收数据至DMA缓冲区;

    • 接收4字节时,会触发TC事件,这时候可以将4字节数据处理;

      3822ec3d63305f892b0296df23ac82ad.png
      第一步
    • 因为是环形模式,所以回到第一个字节处,继续接收10字节,触发HT事件,这时候可以处理10字节数据;

      5bff314d667d74a18c363360a049614d.png
      第二步
    • 第三步,继续接收10字节,触发TC事件,其中,已经有4字节被覆盖(下图橙色所示),因为之前这部分数据已经处理了,所以,即使覆盖也不影响;

      3848e8cda5b4e9f10b433d58f5cdec91.png
      第三步
    • 第四步,上述已经接收了24个字节,所以还有6个字节没有接收,后面接收会产生空闲信号,并对之前的数据区域进行覆盖,如下图示所示;b4615525fd7e14036935eb78b709d729.png

    所以,不难发现,如果只使用空闲中断,如果需要接收的数据长度大于缓冲区,就会出现数据覆盖的情况,而加上DMA的HT和TC中断,就完美解决了这样的问题;

    当然除了这些,还有很多优秀的方案,这个项目提供大量的例子。

    项目地址https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx

    addc49da892257a5663fb48291a0a779.png
    项目主页

    目前这个项目主要支持主流的STM32芯片平台和一些开发板上的测试DEMO,具体如下所示;

    7683d479a3fae2c9e3f247ec15429af6.png
    支持平台

    相应的例子程序如下所示,除了裸机程序,还有环形缓冲区接收,轮询接收,DMA+空闲中断基于RTOS的模式接收,挺丰富的,可以参考一下;

    0ae8050e684782063f72a0ffd8a490b7.png
    例子程序

    作者在 STM32F413-Nucleo 开发板进行程序的测试,发现优化效果很不错;

    115200的串口波特率下,每秒发送1581个字节,大约142ms;

    • 不使用DMA,CPU负载14%;

    • 使用DMA,CPU负载0%;

    最后,这个项目目前是基于STM32CubeIDE创建的,记得搭建一下环境。如果无法下载,公众号后台回复【高效串口】获取项目代码。

    Enjoy  : )

    往期推荐

    轻量级单片机命令行交互项目,全部开源

    项目版本号怎么命名?看起来牛B

    一招教你轻松看懂波特图

    我又发现了超赞的软硬件项目,全部开源

    搭建了一个轻量级实验室,真香

  • 相关阅读:
    MES系统助力注塑企业降本增效~MES系统厂商~先达智控
    代码随想录算法训练营第二十八天|LeetCode93 复原IP地址、LeetCode78 子集
    java计算机毕业设计中美医院病历管理系统源程序+mysql+系统+lw文档+远程调试
    【SQL】Mysql 时区设置解决--20230928
    【图像笔记】深度图像和深度相机
    python微信小程序 springboot个人健康管理系统java php
    java基于springboot校园师生出入登记系统
    pytest的使用
    微店构造订单页面,自动化抢票
    Java IO面试题及答案整理汇总
  • 原文地址:https://blog.csdn.net/u010632165/article/details/124919672