精准判断帧结束的核心是结合空闲中断(IDLE)与DMA双缓冲。配置DMA循环模式,使能IDLE中断,在中断中读取DMA当前剩余数据量(NDTR)与缓冲区大小,即可确定当前帧长度。为避免数据撕裂,需在IDLE中断中立即停止DMA(或切换缓冲),拷贝数据后再重新启动。实操建议:使用HAL库时,在HAL_UARTEx_RxEventCallback中处理,该回调已封装IDLE事件;若用LL库,需手动处理IDLE标志。双缓冲建议使用两个大小相等的数组,通过DMA的传输完成中断切换,确保写入与处理互斥。另外,可增加超时机制(如定时器)处理无IDLE但数据中断的异常情况。注意:IDLE中断触发时,DMA可能仍在写入,需先读取NDTR并禁用DMA,再拷贝,避免竞态。
mcuku 阿沐 · 2026-08-27