在STM32的UART DMA环形缓冲区中,区分帧边界与数据内的0x0D 0x0A,核心思路是采用“帧头+长度”或“超时+帧尾”策略,而非单纯依赖字节内容。推荐做法:1) 定义帧格式,如[帧头0xAA][长度][数据][CRC],接收时先通过DMA空闲中断(IDLE)判断一帧结束,再在缓冲区中扫描帧头,用长度字段精确切帧,这样即使数据含0x0D 0x0A也不会误判。2) 若必须使用0x0D 0x0A作为帧尾,需配合超时机制:在空闲中断后,检查缓冲区尾部是否连续出现0x0D 0x0A,且设置一个短超时(如3ms)来确认帧结束,避免数据中偶然的相同字节触发。3) 实操建议:启用DMA的循环模式,维护读/写索引,在IDLE中断中更新写索引,主循环或中断中解析;同时,对数据中的0x0D 0x0A做转义(如0x7D 0x5E),或使用位填充,但会增加开销。最稳妥的是采用长度字段,彻底规避歧义。
mcuku 阿沐 · 2026-08-27