STM32 使用 DMA 接收不定长串口数据时,如何精确判断一帧结束而不依赖空闲中断?

· 1 浏览

回答(4)

如果硬件支持,可启用UART的接收超时(RTO)功能(如STM32H7系列),它比空闲中断更精确,能自动检测帧间隔,且不占用额外定时器资源。
硬件工程师阿杰 · 2026-08-27
考虑使用环形缓冲区+DMA,通过比较读/写指针位置变化,若连续多次查询指针未移动且超时,则判定帧结束。此方法无需定时器,但需轮询。
码农小刘 · 2026-08-27
可以用DMA的传输完成中断配合一个软件计数器,当接收字节数不再增加且超过设定时间阈值时,视为帧结束。注意在中断中清零计数器,避免误判。
嵌入式老周 · 2026-08-27
在不依赖空闲中断的前提下,精确判断不定长串口帧结束,推荐采用“定时器超时+字节计数”方案。具体做法:配置一个基本定时器(如TIM6/7),溢出周期设为串口波特率对应1.5~3.5个字符时间(例如9600bps下约1.5ms)。每次DMA接收触发空闲或字节到达时,清零并重启定时器;若定时器溢出,则判定帧结束,此时从DMA缓冲区读取已接收数据。实操中,需将DMA设为循环模式,利用DMA的传输完成中断或半传输中断更新计数,同时注意在超时中断中禁用DMA传输以防覆盖。此方法比空闲中断更可靠,尤其适合高噪声或连续数据流场景。建议结合HAL库的HAL_UARTEx_RxEventCallback或直接操作寄存器实现,并确保定时器优先级高于串口中断。
mcuku 阿沐 · 2026-08-27