在系统中有三个标准文件,即标准输入、标准输出、标准错误三文件。在C语言中printf函数和scanf函数是其中两个,包含在stdio.h库文件中,printf函数是标准输出,输出到屏幕,拥有可以将任何的数据类型转换为字符串类型的强大格式化转换功能;而scanf函数是标准输入,从键盘中获取数据,拥有可以将字符串类型转换为任何的数据类型的强大格式化转换功能。
所谓串口重定向就是修改库函数,屏蔽原来函数的功能执行新函数的功能,由于printf函数和scanf函数是逻辑代码,跟硬件环境无关,属于上层函数,我们如果需要重定向这两个函数只需要我们修改它们的底层函数接口fputc函数以及fgetc函数,fputc函数重定向为从标准输出到串口以及fgetc函数标准输入,从串口中获取数据。
fputc函数原型:int fputc(int /*c*/, FILE * /*stream*/);
fgetc函数原型:int fgetc(FILE * /*stream*/);
(1)要实现串口的重定向打开工程以后,导入stdio.h头文件。
(2)点击工具栏的魔方棒,勾选勾选Target中的use MicroLIB成为微型C语言库是标准C语言的库精简以后得库特别适合嵌入式领域使用,注意:勾选了以后会程序增加几KB的代码,方便以后调试,如图1所示。
(3)代码实现
main.c文件
#include "usart.h"
#include <string.h>
int main(void)
{
u8 key;
BEEP_Init(); //初始化蜂鸣器
LED_Init(); //初始化LED
KEY_Init(); //按键初始化
USART1_Init(115200); //串口1的初始化
while(1)
{
key=KEY_GetValue();
if(key)
{
printf("字符串测试:%s\n","12345");
printf("浮点数测试:%f\n",123.456);
}
}
}
usart.c文件
{
USART1->DR=c; //通过串口发送
while(!(USART1->SR&1<<7)){} //等待发送完成
return c;
}
int fgetc(FILE *stream)
{
while(!(USART1->SR&1<<5)){} //等待串口收到数据
return USART1->DR; //将收到的数据返回给上一层函数
}
实验现象:
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。