找回密码
 立即注册
楼主: Greatxiaozhu

DMA可以从串口逐个拿数据吗

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:359
  • 最近打卡:2026-03-20 21:53:40

844

主题

1万

回帖

2万

积分

管理员

积分
22719
发表于 2024-6-17 15:42:37 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-11-19 14:16:24

7

主题

49

回帖

257

积分

中级会员

积分
257
发表于 2024-6-19 09:28:25 | 显示全部楼层
神*** 发表于 2024-6-17 15:42
4组串口UART使用DMA收发 @STC32G,易用,高效,稳定 !精品实战代码 - DMA: 支持4组串口,3组SPI,I2C,TFT-i8 ...

这段代码我看了,其实也正是由于我提出那个改进建议没有得到解决时,无耐之举,只能这样写!


1. 缓存区接收满数据后,产生中断,而在这份代码中,什么都不做,马上开始下轮接收,如果硬件DMA支持FIFO接收数据,这里的代码是不需要的
1718759706186.png


2. 第2个无耐之举,是下面这里的代码,检查已接收字节数,先取出高字节,再取出低字节,然后再取出高字节,再判断两次取出是否一致,这也是没有办法的办法吧,因为是否有数据不是硬件去维护。。。
af4ed71a7b67892e28ae8a48eef2691.png


3. DMA的串口在接收数据时,只能用查询的办法,并不能等缓存满了再产生中断,因为串口通讯中,大部分所要接收的数据的长度,并不是固定的,比如做modbus从机时,,所以查询是最好的办法,而要想不丢数据,就不能停止DMA,只要把缓存区加大点,并自动循环接收就行了。
1718760337258.png


以上种种,我觉还是很有必要改进一下硬件的。。。

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-02-09 09:57:57
已绑定手机

2

主题

8

回帖

36

积分

新手上路

积分
36
发表于 2026-1-31 23:21:26 | 显示全部楼层
乘*** 发表于 2024-6-19 09:28
这段代码我看了,其实也正是由于我提出那个改进建议没有得到解决时,无耐之举,只能这样写!

特别是第三点是一个很大的痛点,单片机当从机要经常用到接收不定长的一帧数据,用中断模式还好有个串口超时控制寄存器,但是每个字节都要介入串口中断接收处理,占用资源。而DMA模式好处是接收一帧数据的每个字节几乎不需要介入串口接收中断处理,但是无法知道一帧数据的长度。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-24 05:59 , Processed in 0.106411 second(s), 56 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表