STM32将printf重定向到UART后输出出现阶梯状缩进问题如何解决
问题原因
- 核心原因为换行符处理逻辑不匹配:你代码中printf使用的是
\n(换行符,LF),但绝大多数桌面串口终端默认的换行规则要求同时收到\r(回车符,CR)+\n才会完成“光标下移一行+回到行首”的完整操作。仅收到\n时,终端只会将光标下移一行,水平位置保持在上一行输出结束的位置,下一行内容就会从该位置开始输出,多次换行后就会呈现阶梯状缩进效果,看起来像是多了额外空格。
修复方案
有两种可行的修复方案,优先选择第二种兼容性更强:
方案1:直接修改打印语句
将所有printf语句中的\n替换为\r\n,无需修改重定向代码即可解决问题,缺点是需要修改所有打印语句,改动量较大。
方案2:修改重定向代码自动转换换行符
在_write函数中对输出字符做预处理,遇到\n时自动先输出\r,无需修改原有打印语句,兼容性最高,修改后的重定向代码如下:
int _write(int file, char *ptr, int len) { for (int i = 0; i < len; i++) { // 遇到换行符先发送回车符 if (ptr[i] == '\n') { char cr = '\r'; HAL_USART_Transmit(&husart3, (uint8_t*)&cr, 1, HAL_MAX_DELAY); } HAL_USART_Transmit(&husart3, (uint8_t*)&ptr[i], 1, HAL_MAX_DELAY); } return len; }
注意事项
如果修改换行转换逻辑后问题仍然存在,可检查是否关闭了半主机模式,半主机模式开启时会干扰标准IO的重定向逻辑,可在代码中添加对应语句关闭:
// KEIL开发环境关闭半主机模式 #pragma import(__use_no_semihosting) // GCC开发环境关闭半主机模式 // __asm(".global __use_no_semihosting");
内容的提问来源于stack exchange,提问作者Fahad Ali Sarwar
相关产品推荐
相关产品推荐

