#printf()函数和scanf()函数重定向
在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到printf()函数或者scanf()函数,但是printf()这个函数是格式化输出到屏幕的,scanf()函数又是格式化输入(从屏幕),并不能输出到串口助手中,所以需要进行重定向。


在系统中有三个标准文件:标准输入,标准输出,标准错误。
***printf : 强大的格式化转换(可以将任何类型转为字符串)。 ***
scanf : 强大的格式化转换(可以将字符串类型转为任何类型)。


要重定向,首先要找到底层函数:
1.printf()函数的底层函数接口:在头文件<stdio.h>中第620行左右处,
这里写图片描述
找到这个函数后,就可以开始写函数了

int fputc(int c, FILE *stream)
{
	USART1->DR = c;//将c赋给串口1的DR寄存器,即重定向到串口,也可以是其他的接口
	while(!(USART1->SR & (1 << 7))){};//等待数据发送完成
	return c;
}

2.scanf()函数的底层函数接口:在头文件<stdio.h>中第595行左右处,
这里写图片描述
重定向函数如下:

int fgetc(FILE *stream)
{
	while(!(USART1->SR & (1 << 5))){};//等待数据接收完成
	return USART1->DR;
}

写好这两个函数后就可以在其他。.c文件中使用printf()函数将数据打印到串口调试助手了,当然也可以使用scanf()函数从串口调试助手输入数据。和C语言中的使用如出一辙,一毛一样!

值得注意的是:1.在头文件<stdio.h>中已经有fgetc()和fputc()这两个函数,为什么又可以再写这两个函数呢?难道不会产生重定义的错误吗?其实头文件<stdio.h>是在微信C语言库中,简称微型库。学过C语言的就知道,C代码在运行的时候,会优先在当前的.c文件中查找这两个函数,没有的话就会从系统默认的路径下查找。
使用printf()和scanf()时要包含头文件<stdio.h>,微型库也要勾选上,如下图:
这里写图片描述
2.勾选上微型库再进行编译的时候,会发现多了几KB的代码,在工程完成的时候就没必要再勾选上,再者,printf()函数仅仅是方便调试,在工程完成的时候也应该去掉!

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐