STM32 使用 DMA 双缓冲接收不定长串口数据时,如何避免缓冲区切换瞬间丢字节?

· 1 浏览

回答(4)

考虑使用硬件双缓冲(如STM32F4的DMA双缓冲模式),自动切换缓冲区,无需软件干预,但需注意缓冲区大小要足够大,且处理速度要跟上DMA速率。
嵌入式小张 · 2026-08-27
如果丢字节发生在切换瞬间,可能是中断优先级问题。将DMA中断优先级设为最高,并确保ISR内不执行耗时操作,比如只做标志位设置,数据拷贝放到主循环。
码农小刘 · 2026-08-27
建议使用空闲中断(IDLE)配合DMA,当检测到总线空闲时再处理数据,这样能确保一帧数据完整接收,避免半帧处理导致的丢字节。
嵌入式老周 · 2026-08-27
核心思路:利用DMA的传输完成中断(TC)和半传输中断(HT)来同步切换缓冲区,并在中断服务程序(ISR)中立即处理数据,避免在切换瞬间产生数据丢失。具体做法:1)配置DMA为循环模式,开启HT和TC中断;2)在HT中断中处理第一个缓冲区(Buffer1),在TC中断中处理第二个缓冲区(Buffer2),处理时先读取DMA当前剩余计数(DMA_GetCurrDataCounter)以确定有效数据长度,再拷贝数据到应用层;3)切换缓冲区时,确保在中断内完成指针切换,且处理速度要快于DMA写入速度,否则可考虑使用双缓冲加乒乓机制,即一个缓冲区被DMA写入,另一个被CPU处理,交替进行;4)若数据量较大,可在ISR中仅做数据搬移,将解析工作放到主循环或任务中,避免阻塞中断。此外,需注意DMA配置时设置数据宽度为字节,并确保缓冲区地址对齐。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

🔗 波特率计算器