【STM32入门教程】将printf重定向到USART串口以USB转串口为例在STM32开发中printf是一个非常方便的调试工具。但默认情况下printf会输出到标准输出设备如屏幕而在嵌入式系统中我们需要将它重定向到串口USART以便通过USB转串口模块在PC端的串口助手如XCOM、SecureCRT中查看输出。本文将介绍如何通过重写fputc函数将printf输出映射到HAL_UART_Transmit实现通过USART1发送数据。1. 原理说明C标准库中的printf最终会调用底层的fputc函数来输出单个字符。在嵌入式环境中我们只需重写fputc在其中调用串口发送函数即可。intfputc(intch,FILE*f){// 调用HAL库的串口发送函数HAL_UART_Transmit(huart1,(uint8_t*)ch,1,HAL_MAX_DELAY);returnch;}注意需要包含stdio.h并且可能在工程设置中勾选“Use MicroLIB”Keil环境下。2. 完整代码示例#includestring.h#includestdio.h#includestm32f1xx_hal.h// 根据你的芯片型号调整externUART_HandleTypeDef huart1;// 声明已初始化的串口句柄intfputc(intch,FILE*f){// 通过USART1发送一个字节HAL_UART_Transmit(huart1,(uint8_t*)ch,1,HAL_MAX_DELAY);returnch;}3. 使用示例在主函数中初始化串口后就可以直接使用printfintmain(void){HAL_Init();SystemClock_Config();MX_USART1_UART_Init();// 初始化USART1printf(STM32 printf redirection test!\r\n);printf(System is running...\r\n);while(1){HAL_Delay(1000);printf(Tick...\r\n);}}4. Keil工程配置重要如果使用Keil MDK必须勾选Use MicroLIB否则会出现链接错误或printf无输出。配置步骤打开工程选项Target Options切换到Target标签页勾选Use MicroLIB点击 OK 并重新编译微库MicroLIB是为嵌入式环境优化的轻量级C库支持基本的标准I/O重定向。5. 常见问题Q1编译报错undefined reference to fputc原因没有包含stdio.h或者没有正确重写fputc。解决检查是否正确包含头文件并实现fputc函数。Q2串口没有输出任何数据可能原因串口未初始化或波特率与PC端不匹配未勾选Use MicroLIBHAL_UART_Transmit参数有误比如句柄不是huart1USB转串口接线错误TX接RXRX接TXGND接GNDQ3输出乱码解决确认串口助手波特率、数据位、停止位、校验位与代码中huart1初始化配置完全一致。6. 扩展说明如果不使用MicroLIB例如GCC/CLion环境可以重写_write函数来实现类似功能。如果需要同时支持多个串口作为printf输出可以在fputc中增加条件判断或全局变量控制。避免在中断服务函数中使用printf防止阻塞或重入问题。7. 总结通过重写fputc只需几行代码即可将printf重定向到USART串口极大方便调试和信息输出。这是STM32开发中非常实用的小技巧也是入门必备知识点之一。核心代码回顾intfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,HAL_MAX_DELAY);returnch;}