STM32 printf 串口重定向代码完整解析

📅 2026/7/2 2:19:28
STM32 printf 串口重定向代码完整解析
STM32 printf串口重定向代码完整解析一、先提取图片完整代码#includeusart.h/* USER CODE BEGIN 0 */intfputc(intch,FILE*f){/* 发送一个字节数据到串口DEBUG_USART */HAL_UART_Transmit(huart1,(uint8_t*)ch,1,1000);return(ch);}/* USER CODE END 0 */二、核心概念什么是串口重定向1. 标准C库默认行为C语言标准函数printf()、putchar()底层依赖标准库函数fputc默认是向**电脑屏幕标准输出stdout**输出字符。但单片机没有屏幕直接调用printf会报错、无任何输出。2. 重定向本质重写fputc函数把原本输出到屏幕的字符拦截下来改用串口USART1发送出去。之后你在代码里直接写printf(hello\r\n);字符串就会通过串口1发送到电脑串口助手实现打印调试。三、逐行拆解代码逻辑int fputc(int ch, FILE *f)fputc标准库单字符输出底层接口printf循环调用它逐个输出字符ch要输出的单个字符ASCII码int类型兼容扩展字符FILE *f文件指针printf默认传入标准输出stdout这里我们不需要用到仅占位HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 1000);HAL库阻塞式串口发送函数参数含义huart1串口1句柄CubeMX生成对应硬件USART1(uint8_t *)ch取字符ch的地址强转为字节指针供函数读取1字节数据1本次只发送1个字节1000发送超时时间1000ms超时直接退出return (ch);标准规范发送成功后返回原字符兼容标准库逻辑不能省略。四、使用前提必须满足否则报错CubeMX已配置USART1生成huart1全局句柄并且正确初始化串口工程需要勾选Use MicroLIBKeil MDK否则标准库FILE接口缺失重定向失效头文件依赖需要包含stdio.h否则FILE、printf未定义硬件USART1 TX/RX引脚接USB转串口模块连接电脑串口助手。五、完整使用示例#includestdio.h// 必须加printf、FILE定义在这里#includeusart.h/* USER CODE BEGIN 0 */intfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,1000);returnch;}/* USER CODE END 0 */intmain(void){HAL_Init();SystemClock_Config();MX_USART1_UART_Init();while(1){// 直接使用printf自动走串口1输出printf(当前循环运行中\r\n);HAL_Delay(1000);}}六、优缺点 补充注意优点不用手动调用HAL_UART_Transmit拼接字符串直接用熟悉的printf格式化打印支持%d %s %f等格式化输出调试更方便。缺点HAL_UART_Transmit是阻塞发送串口发送时CPU卡死等待大量打印会拖慢程序运行只能单向发送若需要scanf串口接收还要重写fgetc函数不加MicroLIB会出现内存溢出、程序卡死。优化拓展非阻塞版本如果担心阻塞可以改用中断/DMA发送替换HAL_UART_Transmit// 非阻塞版本不占用CPUHAL_UART_Transmit_IT(huart1,(uint8_t*)ch,1);while(HAL_UART_GetState(huart1)HAL_UART_STATE_BUSY_TX);七、一句话总结这段代码是STM32 HAL库的printf串口重定向模板通过重写标准库底层输出函数fputc把printf打印内容转发到硬件串口1实现单片机向电脑串口助手打印调试信息。