使用串口 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在线答疑解惑! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/336035.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive基础知识(六):Hive 配置运行日志信息、打印当前库和表头、参数配置方式

1. Hive 运行日志信息配置 1)Hive 的 log 默认存放在/tmp/atguigu/hive.log 目录下(当前用户名下) 2)修改 hive 的 log 存放日志到/opt/module/hive/logs (1)修改/opt/module/hive/conf/hive-log4j2.prop…

Java EE 博客系统(Servlet版)

文章目录 1. 基本情况2. 准备工作3. 博客列表页4. 博客详情页5. 实现登录6. 强制要求登录7. 显示用户信息8. 退出登录9. 发布博客10. 如果程序出现问题怎么办? 1. 基本情况 这里的博客系统主要是四个界面 博客列表页 显示出当前网站上都有哪些博客博客详情页 点击…

【实用技巧】Windows 电脑向iPhone或iPad传输视频方法1:无线传输

一、内容简介 本文介绍如何使用 Windows 电脑向 iPhone 或 iPad 传输视频,以 iPhone 为例,iPad的操作方法类似,本文不作赘述。 二、所需原材料 Windows 电脑(桌面或其它文件夹中存有要导入的视频)、iPhone 14。 待…

Vue项目nginx部署到线上,访问时加前缀解决方案

一、业务场景: 最近项目开发完了,需要部署一个测试版本和正式版本到线上,测试版本前面需要加一个dev前缀,遇到了一些坑,分享给大家 二、目前效果 三、具体实现步骤: (1)实现静态文…

Spring+Vue实战项目环境准备跑通程序

SpringVue 源项目 后端: 首先在GitHub上克隆项目到本地(zip包下载/sourcetree拉取/gitbash克隆)。 https://github.com/songboriceman/doubao_community_backend 然后下载Lombok安装到你的IDE(eclipse)。 https://p…

[AutoSar]基础部分 RTE 04 数据类型的定义及使用

目录 关键词平台说明一、数据类型分类二、Adt三、Idt四、Base 数据类型五、units六、compu methods七、data constraint 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C,C编译器HighTec (GCC) 一、数据…

Linux 内核如何根据设备树文件来匹配内核

一. 简介 上一篇文章学习了 Linux内核如何确定是否支持此设备,如果支持,设备就会启动 Linux 内核。 文章地址如下: 设备树根节点下的compatile属性的作用-CSDN博客 本文继上面文章的学习。这里简单看一下, Linux 内核是如何根…

vmware虚拟机内存异常占用问题一例

关键词 vmware esxi、hypervisor虚拟化平台内存模式 Guest virtual memory 一、问题现象 业务一台vmware虚拟机出现内存使用率告警,运维人员登录系统检查内存确实高水位状态 检查各进程使用内存不高,合计内存总数与使用率占用情况明显不匹配&#xf…

大漠插件7.2353

工具名称:大漠插件7.2353 更新时间2023-12-29更新内容/v7.23531. FindPicSim优化,防止有些时候会找不到图2. 增加接口TerminateProcessTree3. 解决AsmCall 模式6在部分WIN11下无法正常生效的BUG/ 工具简介:大漠 综合 插件 (dm.dll)采用vc6.0编写,识别速度超级快&…

某查查请求头参数加密分析(含JS加密算法与Python爬虫源码)

文章目录 1. 写在前面2. 请求分析3. 断点分析4. 扣加密JS5. Python爬虫代码实现 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】&#xff…

TypeScript进阶(一)深入理解类和接口

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的超集,意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript,使其更适合大型项目和团队开发。 在TypeS…

Cypress.io:快速简单可靠的浏览器测试工具 | 开源日报 No.142

cypress-io/cypress Stars: 45.5k License: MIT Cypress.io 是一个快速、简单和可靠的浏览器测试工具,可以用于任何在浏览器中运行的内容。它支持 Mac、Linux 和 Windows 系统,并提供了安装指南。 hrvach/deskhop Stars: 4.1k License: GPL-3.0 DeskH…