当前位置: 首页 > news >正文

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

一、简介

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

 
二、方法思路

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

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


2. 使能定时器中断、使能 DMA。

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

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

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


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

 
三、代码实现


1. 使能串口及串口 Rx Start 中断,


2. 使能定时器中断、DMA 中断并开启串口 DMA 接收。


3. 进入串口 Rx Start 中断,开启定时器。


4. 定时结束、进入定时器中断,在定时器中断中获取剩余未读取的字节数,计算已接收字节数。并对读取到的数据 buffer 进行处理。


5. 将 DMA 重新进入空闲状态,并开启下一次串口 DMA 接收,以此循环。


四、测试

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




五、总结

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

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

相关文章:

  • 金蝶云星空与金蝶云星空对接集成逐个单据查询连通员工新增(3009-销售退货清理卡片)
  • 小程序中滚动字幕
  • windows搭建银河麒麟v10虚拟机
  • WAMP apache 无法启动(端口 80 未使用)
  • Android Jetpack中Lifecycle使用生命周期感知型组件处理生命周期
  • Canvas 指南与总结
  • 基于Python的汽车信息爬取与可视化分析系统
  • 带你玩转汇编
  • 单片机原理及应用:定时器/计数器综合应用
  • BioTech - 蛋白质结构、核酸结构、小分子构象的预测
  • npm run dev,vite 配置 ip 访问
  • 怎么把身份证压缩到200k以下?一分钟教你如图片压缩
  • 人工智能技术的应用
  • 重生奇迹mu敏弓加点攻略
  • PHP 正则表达式(PCRE)
  • MaxCompute访问TableStore(OTS) 数据
  • Python学习之路16-使用API
  • React-生命周期杂记
  • spring-boot List转Page
  • Xmanager 远程桌面 CentOS 7
  • 从零开始的无人驾驶 1
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我与Jetbrains的这些年
  •  一套莫尔斯电报听写、翻译系统
  • 1.Ext JS 建立web开发工程
  • HanLP分词命名实体提取详解
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • #define与typedef区别
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (2.2w字)前端单元测试之Jest详解篇
  • (6)STL算法之转换
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)PySpark3:SparkSQL编程
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (转)jQuery 基础
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • . NET自动找可写目录
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core Web APi类库如何内嵌运行?
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET和.COM和.CN域名区别
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [].slice.call()将类数组转化为真正的数组
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [Android]如何调试Native memory crash issue
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用