STM32 使用DMA+双缓冲接收不定长串口数据时,如何避免缓冲区覆盖与丢帧?

· 1 浏览

回答(4)

考虑用硬件流控(RTS/CTS)或增加帧头帧尾校验,从协议层减少丢帧影响,软件上重传机制兜底。
通信工程师阿杰 · 2026-08-27
若使用双缓冲,注意DMA半传输和全传输中断的优先级,确保处理逻辑无临界区冲突,可加临界保护。
码农小刘 · 2026-08-27
用环形缓冲区配合DMA循环模式更稳,空闲中断只标记帧尾,主循环轮询环形队列处理,避免中断中长时间占用。
嵌入式老张 · 2026-08-27
核心方案:采用DMA双缓冲(如STM32的DMA循环模式或双缓冲模式)配合空闲中断(IDLE)或超时定时器来界定帧边界。具体实操:1) 配置DMA为循环模式,使能两个缓冲区(如Buffer1/Buffer2),当DMA传输完成一半或全部时触发中断,在中断中切换处理缓冲区;2) 使用串口空闲中断(USART_IT_IDLE)检测一帧结束,在空闲中断中记录当前DMA接收位置,并立即处理已接收数据,同时重置DMA指针(如修改NDTR)避免覆盖;3) 若数据帧较长,可结合定时器超时(如10ms无新数据视为帧尾)作为备用方案。关键点:在DMA中断中,先读取DMA剩余计数(如DMA_GetCurrDataCounter)计算实际接收长度,再拷贝数据到用户缓冲区,最后清标志并重新启动DMA。注意:双缓冲切换时需确保处理速度大于接收速率,否则仍会丢帧;建议在中断中只做数据搬移,业务处理放主循环。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

🔗 波特率计算器