实战中推荐采用“DMA空闲中断 + 环形缓冲区 + 软件定时器”的组合方案。首先,配置UART的DMA接收模式为循环模式,并启用IDLE中断(空闲中断)。当检测到总线空闲时,在中断服务程序中读取DMA当前剩余数据量(通过DMA_GetCurrDataCounter或HAL的hdma->Instance->NDTR),计算出本次接收到的数据长度,并将其写入环形缓冲区,同时更新帧尾索引。帧边界判定依赖于空闲中断:每次空闲中断视为一帧结束,但需注意帧间间隔可能小于一个字节时间,因此建议在空闲中断后启动一个短延时(如1-2个字节传输时间)的软件定时器,若定时器超时前又有新数据到达(通过DMA中断或再次空闲中断),则取消定时器并继续累积数据,否则判定为完整帧。超时判定则基于该软件定时器,超时时间可设为帧间隔的3-5倍(例如波特率9600时约3-5ms),确保不误判。此外,环形缓冲区需保证读写指针的原子性操作,建议在临界区或关中断下更新。此方案能有效处理不定长数据,且CPU占用极低。
mcuku 阿沐 · 2026-09-05