STM32F405串口DMA转发460800波特率下丢包问题求助
STM32F405RGT6 460800波特率串口转发丢包问题分析
问题概述
- 硬件平台:STM32F405RGT6
- 功能需求:UART2以460800波特率通过DMA循环接收数据存入环形缓冲区,再通过UART3以相同波特率DMA转发
- 异常现象:发送434724字节,PC仅收到358834字节;代码内统计变量
rcv_T3、crx[1].stream_cnt与发送量完全匹配 - 特殊场景:UART2用115200波特率、UART3用460800波特率时无丢包
核心代码逻辑
接收流程
- 触发源:DMA半完成中断、DMA完成中断、UART空闲中断
- 操作:中断回调中将DMA缓冲区数据转存至接收环形缓冲区,再写入转发用环形缓冲区
发送流程
- 检测机制:独立线程轮询转发环形缓冲区(txRingbuf)数据量
- 发送控制:缓冲区有数据时启动DMA发送,通过发送完成中断设置标志,避免重复触发发送
排查方向
转发线程调度瓶颈
同波特率下,接收数据速度与发送理论速度一致,但线程轮询存在固有延迟,若线程优先级过低,无法及时响应环形缓冲区的数据写入,会导致数据堆积,后续DMA发送无法完全覆盖堆积数据。可尝试提升转发线程优先级,或改用中断触发发送(而非线程轮询),减少调度延迟。UART3 DMA发送配置缺陷
检查UART3的DMA发送模式:若误用循环模式,发送完成后未正确更新待发送数据长度,会导致部分数据被跳过;确认发送完成中断标志是否被及时清除,若中断被屏蔽或标志未清除,会阻塞下一次发送触发,造成数据滞留。硬件信号完整性问题
460800波特率对信号时序要求更高,排查UART3的硬件链路:线路过长、电磁干扰、电平不匹配都可能导致PC端接收丢包(MCU侧DMA已发送数据,但物理链路丢失)。可单独测试UART3直接发送相同字节数,验证PC端接收完整性,排除硬件问题。环形缓冲区同步问题
接收中断回调与转发线程同时操作环形缓冲区时,若未做互斥保护,高波特率下可能出现读写冲突,导致读取的数据不完整,但接收统计变量仅统计写入量,因此显示正常。需添加临界区保护或使用原子操作确保缓冲区读写安全。
内容的提问来源于stack exchange,提问作者Wiston
相关产品推荐
相关产品推荐

