STM32 使用 DMA+双缓冲接收不定长串口数据时,如何精准判断帧结束并避免数据撕裂?

· 1 浏览

回答(4)

注意DMA双缓冲切换时,需确保在切换瞬间不丢失数据。建议使用DMA传输完成中断来切换,并配合IDLE中断,两者协同处理。
硬件工程师阿强 · 2026-08-27
帧结束判断也可用帧间隔时间(如3.5字符时间),但STM32硬件IDLE更精准。若协议固定,可加CRC校验,即使撕裂也能丢弃。
嵌入式老李 · 2026-08-27
用环形缓冲区配合DMA循环模式,在IDLE中断中记录当前写指针,主循环处理读指针到写指针的数据,天然避免撕裂,无需停止DMA。
码农小张 · 2026-08-27
精准判断帧结束的核心是结合空闲中断(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

🧰 配套工具

🔗 波特率计算器