精准判断帧结束的核心是结合空闲中断(IDLE)和双缓冲的乒乓切换。首先,配置DMA为循环模式,并启用串口空闲中断。当接收完一帧数据后,硬件触发IDLE中断,在中断服务程序中立即读取DMA的当前数据指针(NDTR或CNDTR),计算出已接收长度,然后切换缓冲区(通过修改DMA的M0AR/M1AR或直接切换当前使用的缓冲索引)。关键点:在IDLE中断中,要禁用DMA传输(或暂停),处理完数据后再重新启用,避免数据覆盖。同时,确保双缓冲大小足够容纳最大帧长,且处理速度要快于接收速率。为避免丢包,可在IDLE中断中先拷贝数据到应用层缓冲区,再清标志。另外,可结合超时机制(如定时器)作为兜底,防止IDLE中断丢失(如连续数据流中无空闲)。实操建议:使用HAL库的HAL_UARTEx_ReceiveToIdle_DMA,并在回调中处理,注意在回调中重新启动接收。
mcuku 阿沐 · 2026-08-27