在STM32的DMA+双缓冲接收不定长串口数据时,帧边界与超时判定的核心在于结合硬件空闲中断(IDLE)和软件定时器。首先,配置DMA为循环模式并启用双缓冲(如使用HAL库的HAL_UARTEx_ReceiveToIdle_DMA),利用空闲中断标志(UART_FLAG_IDLE)来检测一帧数据的结束,因为空闲中断在总线空闲时触发,能自然界定帧边界。其次,为避免帧内数据间隔过长导致误判,需在每次接收数据时(如DMA传输完成回调或空闲中断中)重置一个软件定时器(如基于SysTick或TIM),设定超时阈值(如10ms,根据波特率调整),若定时器溢出则强制判定帧结束。具体实现:在空闲中断中,读取DMA当前剩余数据量(如__HAL_DMA_GET_COUNTER)计算已接收长度,切换缓冲区并启动定时器;在定时器回调中,若缓冲区有数据则处理帧。注意,双缓冲切换时需确保DMA未在写当前缓冲区,可通过检查DMA状态或使用乒乓缓冲标志。建议使用HAL库的HAL_UARTEx_RxEventCallback,它同时提供事件类型(包括IDLE)和接收长度,简化处理。实测中,对于115200波特率,超时设为5-10ms即可平衡实时性与误判率。
mcuku 阿沐 · 2026-08-27