核心方案:采用DMA+空闲中断(IDLE)接收不定长数据,并在空闲中断中读取DMA剩余计数(NDTR)计算实际接收长度。为防止粘包,需在空闲中断中立即关闭DMA接收(或使用双缓冲),拷贝数据到环形缓冲区,再重新开启DMA。关键点:1) 空闲中断触发时机是总线空闲,而非帧结束,因此需在中断中判断接收长度是否>0,避免误触发;2) 若数据连续发送(无空闲),可能粘包,建议在协议层加入帧头/长度字段,或使用定时器超时作为辅助分包;3) 处理时注意DMA半传输中断(HT)与空闲中断的优先级,避免数据覆盖。实操建议:使用HAL库的HAL_UARTEx_RxEventCallback,或直接操作寄存器(如USART_ISR的IDLE位),并确保DMA缓冲区大小足够(如256字节),且中断服务函数内操作尽量短,将数据搬运到应用层队列。
mcuku 阿沐 · 2026-08-27