fputc函数重写实现printf重定向

一,printf重定向原理

1,自己重写C的库函数

      链接器检查到用户编写了与C库函数相同名字的函数时,优先调用用户编写函数,这样就可实现重定向

2,重定向printf()函数

         需重写fputc()这个c标准库函数(printf()在c标准库函数实质是一个宏,实际是调用fputc()函数)

         说明

                fputc()默认是把字符输出到调试器控制窗口,要把数据通过USART输出到串口助手,需对基于fputc()的printf()系列函数

                 的输出都重定向到USART端口上去,要想使用USART功能,需重定向fputc()函数

二,操作步骤

1,在工程文件中实现fputc

///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
		/* 发送一个字节数据到串口 */
		USART_SendData(USART3, (uint8_t) ch);
		
		/* 等待发送完毕 */
		while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
		/* 等待串口输入数据 */
		while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveD
### 实现 `printf` 函数的输出重定向 为了使 `printf` 的输出能够通过串口发送,在嵌入式系统中可以重新定义标准 I/O 流的行为。具体来说,这涉及到修改 `_write()` 或者覆盖 `fputc()` 函数[^4]。 #### 方法一:重写 _write() 函数 (适用于某些编译器) 对于一些特定的编译环境(比如 GCC),可以通过提供自定义版本的 `_write()` 来改变 printf 输出方向: ```c #include <unistd.h> #include "stm32f10x.h" // 假设使用的是 STM32F1 系列单片机 int _write(int file, char *ptr, int len){ while(len--) { USART_SendData(USART1, *ptr++); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } return len; } ``` 此方法依赖于底层硬件抽象层(HAL),因此具体的寄存器操作可能因不同的微控制器而异。 #### 方法二:替换 fputc() 另一种常见的方式是在项目中加入如下代码片段来替代默认的标准库中的 `fputc()` : ```c #include <stdio.h> #include "stm32f10x.h" // 重载fputc函数以便支持串口通信 int fputc(int ch, FILE *f){ USART_SendData(USART1, (uint8_t )ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET){}; return ch; } ``` 这段代码同样假设正在使用的平台为基于 ARM Cortex-M 架构的 STM32 微处理器,并且已经初始化好了 UART 接口[^3]。 当上述任一种方式被采用之后,所有的 `printf` 调用将会自动把字符串发送给指定的串行端口而不是屏幕显示设备。需要注意的是,实际应用时还需要确保相应的外设已经被正确配置并启动了中断服务程序(ISR)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

试探你的温柔耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值