在STM32 HAL库中,DMA串口接收常用"半满中断+空闲中断"实现不定长数据接收:启动HAL_UART_Receive_DMA后,DMA在缓冲区半满时触发HT中断,在接收完成时触发TC中断,而USART空闲中断(IDLE)在总线空闲一帧时间后触发。典型做法是在HAL_UARTEx_RxEventCallback中根据Size判断:Size<半缓冲区长度说明是IDLE或HT事件,可处理前半段;Size==缓冲区长度说明是TC事件。丢包排查重点:1)确认IDLE中断是否使能(__HAL_UART_ENABLE_IT(&huart, UART_IT_IDLE)),HAL库新版用HAL_UARTEx_ReceiveToIdle_DMA更省事;2)回调中处理数据要及时,避免在回调里做耗时操作导致DMA覆盖;3)检查DMA缓冲区是否被其他代码改写、Cache一致性(带D-Cache的MCU需SCB_InvalidateDCache_by_Addr);4)确认串口波特率误差、DMA通道优先级和中断优先级配置;5)用逻辑分析仪或计数器统计接收字节数与实际发送数对比定位。