printf重定向:一句fputc,串口打印任意变量

短文标题:printf重定向:一句fputc,串口打印任意变量

你有没有想过一个问题:电脑上调试程序,用printf直接打印变量值,一目了然。

单片机没有显示器,怎么实现类似的效果?重定向printf到串口。 把printf这个"输出口",从电脑屏幕"拧"到单片机的USART上。重定向fputc,printf底层会调用fputc输出每一个字符。我们只需要重写fputc,把字符通过USART发送出去:

int fputc(int ch, FILE *f)

{

while (!(USART1->SR & USART_SR_TXE)); // 等待上次发送完成

USART1->DR = (uint8_t)ch; // 发送字符

return ch;

}

写好这个函数,就可以直接用printf了:

int temperature = 25;

printf("当前温度: %d 度\r\n", temperature);

串口调试助手就能看到"当前温度: 25 度"。浮点数(%f)支持需额外配置(MicroLIB默认不支持)。MicroLIB:必须勾选的关键,在MDK(Keil)中,只用fputc还不够。必须勾选Use MicroLIB(微库)。否则链接时会报错,或运行时卡死。MicroLIB是ARM为嵌入式设备精简的C库,移除了半主机依赖,体积小。

半主机模式的陷阱,ARM标准库默认支持"半主机模式"(通过调试器与主机通信,如printf输出到IDE的Debug Viewer)。单片机独立运行时没有调试器,半主机模式会让程序卡死。勾选MicroLIB(禁用半主机),或手动实现__FILE结构体的桩函数,让半主机失效。MicroLIB最简单,推荐。

MicroLIB的限制

• 不支持浮点数(%f):浮点转字符串代码体积大,MicroLIB默认不包含。变通:整数部分和小数部分分开打印

int temp_x10 = 261;

printf("温度: %d.%d℃\r\n", temp_x10 / 10, temp_x10 % 10);

• 不支持宽字符

• 部分标准函数功能简化

对嵌入式调试而言,这些限制通常可接受。多串口支持,需要同时使用多个串口(如USART1打印日志,USART2通信),可自定义类printf函数,传入串口句柄:

int printf_usart(UART_HandleTypeDef *huart, const char *format, ...)

{

char buf256;

va_list args;

va_start(args, format);

int len = vsnprintf(buf, sizeof(buf), format, args);

va_end(args);

HAL_UART_Transmit(huart, (uint8_t*)buf, len, 100);

return len;

}

这个故事的启示,重定向fputc是用标准库实现硬件输出的通用方法------printf只负责格式化,底层输出函数指向你的USART。改一个函数,printf就能活过来。调试效率提高10倍。写在最后,嵌入式调试,信息越详细,定位Bug越快。重定向printf到串口,让单片机"开口说话"。调试神器,学会就回不去。

(本文灵感源于于振南《新概念ARM32单片机》教程第4.7节"优化 USART 发送,用 printf 打印输出"。)

觉得有用?点赞、转发,让更多人学会"printf重定向"这个调试利器。

相关推荐
zhangrelay6 小时前
新版|-|单片机原理与接口技术-2026持续改进优化-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
笔记·单片机·嵌入式硬件·学习
comyccccc6 小时前
STM32F103C8T6最小系统板设计全解析学习笔记
单片机·1024程序员节
Industio_触觉智能6 小时前
把NPU检测直接嵌进采集终端|RK3576 AI采集终端全链路拆解教程-下
嵌入式硬件·ai·硬件架构·npu·ai视觉·rk3576·采集终端
en.en..7 小时前
STM32 GPIO ODR 与 BSRR 寄存器完整对比详解
单片机·嵌入式硬件
HQB202610 小时前
EG1182|屹晶微电子 60V 内置高压管异步降压 DC‑DC
嵌入式硬件·硬件工程
LCG米11 小时前
STM32硬件SPI驱动SSD1306 OLED实测:上电黑屏排查、页寻址模式与取模扫描方向陷阱
stm32·单片机·嵌入式硬件·嵌入式
深圳老胡12 小时前
STM32C5A3ZG 网络调试总结:从启动失败到连续 Ping 稳定
笔记·stm32·单片机·代码规范
qq_4017004112 小时前
100 个 IoT 小项目,给 ESP32 入门补上实操
前端·网络·stm32
硅基造物主12 小时前
STM32 从 0 到 1 做智能家居(八):PWM 控制风扇、加热片与 SG90 窗帘
stm32·嵌入式硬件·智能家居·hal库·pwm
简单电磁炮12 小时前
关于adc采集
stm32·单片机