STM32单片机基础09——重定向printf函数到串口输出的多种方法

本文详细的介绍了如何重定向printf输出到串口输出的多种方法,包括调用MDK微库(MicroLib)的方法,调用标准库的方法,以及适用于 GNUC 系列编译器的方法。

1.printf与fputc

对于 printf 函数相信大家都不陌生,第一个C语言程序就是使用 printf 函数在屏幕上的控制台打印出Hello World,之后使用 printf 函数输出各种类型的数据,使用格式控制输出各种长度的字符,甚至输出各种各样的图案。

除此之外,在程序出错的时候,懒得调试,直接简单粗暴的加个 printf 找bug,有时候也不失为一种有效的方法。

对于已经习惯的 printf 函数,你了解多少呢?

printf 定义在 <stdio.h> 头文件中,如下:

int printf(const char *format, ...);

printf 函数根据 format 字符串给出的格式打印输出到 stdout(标准输出)中,当然,printf 函数是不会一个字符一个字符去输出,它会调用更底层的 I/O 函数:fputc去逐个字符打印

fputc 也定义于头文件 <stdio.h>中,如下:

int fputc(int ch, FILE *stream);

fputc 函数写入字符 ch 到给定输出流 stream,printf函数在调用该函数时,会向stream参数传入stdout从而打印数据到标准输出。

那么,要实现printf打印到串口就变得非常简单了,只需要重新定义fputc函数,在fputc的函数中将数据通过串口发送,称之为:fputc重定向或者printf重定向。

2.在MDK中使用MicroLib重定向printf

勾选Use MicroLib

MicroLib是对标准C库进行了高度优化之后的库,供MDK默认使用,相比之下,MicroLIB的代码更少,资源占用更少:

mark

重定义fputc到串口

重新实现fputc函数,编写代码将这个字符通过串口发送,因为发送每个字符时都会调用该函数,所以为了效率,不再调用库函数 HAL_UART_Transmit 发送,而是直接操作寄存器发送。

  • 检测串口当前状态

STM32L431的USART串口外设有一个 ISR 寄存器,全名 Interrupt and status register, 用来指示当前串口的状态,如图:</

  • 16
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
printf函数输出重定向串口输出是在嵌入式系统中非常常见的需求。主要是为了方便程序调试,将程序在内存中运行的各种状态信息实时输出串口,以便进行调试和故障排查。下面介绍一下重定向printf函数串口输出多种实现方法。 1. 直接修改标准输出流: 在C语言中,printf函数输出结果的默认流是标准输出流stdout。可以通过修改stdout的指向来实现将printf输出重定向串口模块中。用下面的宏定义可以实现该操作。 #define printf(format, ...) \ usart_printf(format, ## __VA_ARGS__) 其中,usart_printf就是输出串口函数,可以根据具体需要实现。在这也可以通过定义输出重定向函数putc的方法实现。 int fputc(int ch, FILE *f) { usart_putc(ch); return ch; } 在此方法中,usart_putc才是发送数据的函数。 2. 软串口: 软串口的实现方式是将1408体积小的芯片实现成一个UART硬件模块,软件控制TX与RX引脚。实现步骤如下: 1. 选择一个GPIO作为串口的TX引脚,例如PA2 2. 配置TX引脚为GPIO输出模式,速率为波特率(例如9600) 3. 在串口发送函数中,按照帧格式(起始位、数据位、校验位、停止位)发送数据。 3. 硬件串口: 硬件串口的实现方式是将STM32串口模块外置,使用硬件实现串口数据的接收和发送。该实现方法在通讯速度、稳定性和灵活性等方面更加优越,但是需要使用外置的串口硬件模块,而且还需要进行配置硬件的复杂操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值