【STM32】printf重定向到串口 —— 让哑巴开口说话的方法(标准库实现)

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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值