核心思路:利用STM32的UART空闲中断(IDLE)检测一帧数据的结束,配合DMA循环模式将数据连续写入环形缓冲区,从而避免粘包。具体实现:1) 配置DMA为循环模式,接收数据自动存入缓冲区,无需手动搬运;2) 使能USART的IDLE中断,当总线空闲时触发中断,在中断服务程序中读取DMA当前剩余计数(DMA_GetCurrDataCounter),计算本次接收长度,并更新环形缓冲区的写指针;3) 主循环或任务中,通过比较读写指针判断是否有完整数据帧,按帧处理。关键点:环形缓冲区大小需大于最大帧长,避免覆盖;IDLE中断中需先清标志(读SR再读DR)再操作DMA;若需精确帧边界,可结合帧头帧尾校验。实操建议:使用HAL库时,在UART_IRQHandler中调用HAL_UART_IRQHandler后,额外检测__HAL_UART_GET_FLAG(&huart, UART_FLAG_IDLE),并手动复位DMA计数器(如__HAL_DMA_DISABLE再ENABLE),确保数据连续性。
mcuku 阿沐 · 2026-09-05