使用串口 DMA 模式接收不定长数据

一、简介

曾经遇到客户有一个需求,需要用串口 DMA 的方式接收不定长度的数据,DMA 有个缺点就是在每次传输前需要设定好传输的字节长度,这种方式显然对于接收不定长度的数据来说没有那么灵活。但 DMA 也有着显著的优点,如可直接访问内存,减少 CPU 负担等。那么能否有比较好的方式能使用 DMA 去传输不定长的数据呢?当然是有的,以下便介绍其中一种通过定时器使串口 DMA 接收不定长数据的方式,以 NXP LPC5516 的 串口 DMA 例程为例。

二、方法思路

该方法使用到定时器中断和串口中断,具体思路如下。

  1. 使能串口的 RX Start 中断,当串口开始接收数据时会产生一个中断,
  1. 使能定时器中断、使能 DMA。

  2. 调用 USART_TransferReceiveDMA()函数,串口 DMA 开始接收数据,设置接收字节长度为最大字节长度。

  3. 当串口开始接收数据时,产生中断,进入中断函数,这时开启定时器,定时器时长为接收最大字节长度所需的时间,该时间可通过设定的串口波特率计算得出。

  4. 定时结束,触发定时器中断,进入定时中断函数,首先关闭定时器计时,然后读取 DMA 的 XFERCFG 寄存器获得剩余未读取的字节数,最后用设定的 DMA 接收最大字节数减去剩余未读取字节数便得出本次传输已接收的字节数(设定数 - 剩余未接收数 = 已接收数)。

  1. 待得到本次已接收的字节数后,便知道 Buffer 前面几个字节是本次接收到的数据,将其进行处理,最后将 DMA 重新设为空闲状态,同时准备第二次串口接收。

三、代码实现

  1. 使能串口及串口 Rx Start 中断,
  1. 使能定时器中断、DMA 中断并开启串口 DMA 接收。
  1. 进入串口 Rx Start 中断,开启定时器。
  1. 定时结束、进入定时器中断,在定时器中断中获取剩余未读取的字节数,计算已接收字节数。并对读取到的数据 buffer 进行处理。
  1. 将 DMA 重新进入空闲状态,并开启下一次串口 DMA 接收,以此循环。

四、测试

使用 LPC5516 EVK 烧录该工程,闭合跳帽JP12,打开串口工具,发送不同字节长度的数据,可以看到 RX 能正常读取。

五、总结

本文章介绍了一种串口 DMA 接收不定长度数据的方法,通过添加定时器定时最大字节长度的时间,通过剩余未读取的字节数,计算已读取的字节数,再对 Buffer 进行处理。当然该方式由于无论每次读取多少字节的数据,都会花费最大字节数的时间,故只能在对实时性没有特殊要求的情景下使用。以上便是串口 DMA 接收不定长数据的一种方式。

登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑!

相关推荐
生命是有光的12 分钟前
【机器学习】机器学习算法
人工智能·机器学习
Blossom.11815 分钟前
把 AI 塞进「自行车码表」——基于 MEMS 的 3D 地形预测码表
人工智能·python·深度学习·opencv·机器学习·计算机视觉·3d
小鹿的工作手帐3 小时前
有鹿机器人:为城市描绘清洁新图景的智能使者
人工智能·科技·机器人
TechubNews4 小时前
香港数字资产交易市场蓬勃发展,监管与创新并驾齐驱
人工智能·区块链
DogDaoDao5 小时前
用PyTorch实现多类图像分类:从原理到实际操作
图像处理·人工智能·pytorch·python·深度学习·分类·图像分类
小和尚同志6 小时前
450 star 的神级提示词管理工具 AI-Gist,让提示词不再吃灰
人工智能·aigc
金井PRATHAMA7 小时前
大脑的藏宝图——神经科学如何为自然语言处理(NLP)的深度语义理解绘制新航线
人工智能·自然语言处理
大学生毕业题目7 小时前
毕业项目推荐:28-基于yolov8/yolov5/yolo11的电塔危险物品检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·cnn·pyqt·电塔·危险物品
星期天要睡觉7 小时前
深度学习——卷积神经网络CNN(原理:基本结构流程、卷积层、池化层、全连接层等)
人工智能·深度学习·cnn
哈基鑫7 小时前
支持向量机(SVM)学习笔记
人工智能·机器学习·支持向量机