在不依赖空闲中断的前提下,精确判断不定长串口帧结束,推荐采用“定时器超时+字节计数”方案。具体做法:配置一个基本定时器(如TIM6/7),溢出周期设为串口波特率对应1.5~3.5个字符时间(例如9600bps下约1.5ms)。每次DMA接收触发空闲或字节到达时,清零并重启定时器;若定时器溢出,则判定帧结束,此时从DMA缓冲区读取已接收数据。实操中,需将DMA设为循环模式,利用DMA的传输完成中断或半传输中断更新计数,同时注意在超时中断中禁用DMA传输以防覆盖。此方法比空闲中断更可靠,尤其适合高噪声或连续数据流场景。建议结合HAL库的HAL_UARTEx_RxEventCallback或直接操作寄存器实现,并确保定时器优先级高于串口中断。
mcuku 阿沐 · 2026-08-27