printf函数
C语言中,printf函数是我们最常用也是最早学习的函数之一,我们写程序并打印结果到控制台或终端。
printf("Hello World");
printf 是指格式化输出函数,主要功能是向标准输出设备按规定格式输出信息。
printf 是C语言标准库函数,定义于头文件 <stdio.h>。
printf 函数的一般调用格式为:printf("<格式化字符串>", <参量表>)
标准输出设备
标准输出设备本质是一个由操作系统管理的抽象数据流,默认指向用户可见的终端,但可通过多种方式重定向到物理设备或文件。
在C/C++编程中,printf函数的标准输出设备(stdout)通常指以下两种实体之一:
1、默认输出目标:
- 终端/控制台:在命令行程序(如Linux终端、Windows CMD/PowerShell)中,
printf的输出默认显示在当前终端窗口。 - 在IDE(如VS Code、CLion)中运行时,输出会重定向到IDE内置的调试控制台。
2、文件或其他设备(printf可重定向性):
./a.out > output.txt
可通过命令行符号>可将stdout重定向到文件或其他设备:将输出写入文件而非显示到屏幕上。
还可以使用freopen()或管道(pipe)可将stdout绑定到网络套接字、串口等设备。
为什么需要重定向?
STM32单片机并没有默认的显示设备,它是哑巴。打印函数printf无法正常工作。
要让printf函数正常工作,就需要我们手动为它 “指定” 输出方向 —— 这就是重定向技术。
通过重定向fputc函数,我们可以让 STM32 通过串口将数据输出到 PC 端或其他设备,实现实时调试与数据交互。
什么是重定向?
——就是修改printf函数的默认输出目标
printf重定向到串口的标准库实现
在 C 语言中,printf函数会调用fputc函数来完成实际的字符输出操作,而fputc默认指向的输出设备(如终端屏幕)在嵌入式系统中并不存在。因此,我们需要重新实现fputc函数,将字符输出的目标指向 STM32 的串口寄存器或 HAL 库的串口发送函数。
#include "stdio.h"
#include "stm32f10x.h"
// 功能:printf函数重定向
// 重定向fputc函数到USART1
// printf函数多次调用该函数,每次调用都会将一个字符给参数1
// 参数1:依次获取printf函数的一个字符
int fputc(int c, FILE* stream) {
while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
// 等待串口发送缓冲区为空(TC标志位为1)
USART_SendData(USART1, (u8)c);
// 通过USART_SendData将字符写入串口的发送数据寄存器(DR)
// 由硬件完成实际的串口发送过程
return c;
}
注:添加#include "stdio.h",并在 Keil 中勾选Use MicroLIB。
重定向的调试应用场景
1、实时数据监控:通过printf输出传感器采集的数据(如温度、电压等),在 PC 端串口调试助手中实时显示,方便观察数据变化趋势。
2、程序流程跟踪:在代码中插入printf语句,输出关键变量或函数执行状态,快速定位程序运行中的问题。
3、命令交互:结合串口接收功能,实现简单的命令行交互界面,通过printf返回命令执行结果。
if (cmd == "version") {
printf("System version: V1.0.0\n");
}
参考链接
部分信息来自此文:
我根据此文↓做了信息提炼工作和逻辑梳理工作,写得更清楚\(^o^)/~
也整合了来自ai的信息(。-ω-)zzz
小知识:STM32 printf 重定向(串口输出)--让数据 “开口说话” 的关键技巧_stm32 printf重定向-CSDN博客


1834

被折叠的 条评论
为什么被折叠?



