根因通常不在DMA本身,而在HAL_UARTEx_ReceiveToIdle_DMA的回调处理链:1) 空闲中断触发后若未及时重启接收,下一帧数据到达时DMA已停止搬运,造成整帧丢失;2) 用户回调中执行耗时操作(如printf、复杂解析),期间串口仍在收数,HAL层未做环形缓冲,超出DMA剩余空间即溢出;3) 半满/全满中断与IDLE中断竞争,HAL_UART_IRQHandler中先清标志再处理,若处理慢会覆盖;4) DMA缓冲区大小与波特率不匹配,高波特率下IDLE间隔极短。改造建议:弃用单次ReceiveToIdle,改用DMA循环模式+自定义环形缓冲,在HAL_UARTEx_RxEventCallback中仅记录写指针并置信号量,解析放主循环;或采用双缓冲(ping-pong)DMA,半满和全满各触发一次回调,回调内只做memcpy到软件队列,避免在中断里重启DMA。关键点:回调必须短、接收永不停止、缓冲区按最大帧长2倍以上设计。