电子说
在前两天介绍的串口输出中,函数Usart1_SendStr只能输出字符串,如果想输出一个整型或者其他类型的数据,单独用这个函数是不能实现的。今天跟大家简单介绍下格式化输出,让输出不再只有字符串。
格式化输出有****3种方法 :sprintf结合usart输出;使用MicroLIB调用printf输出;重定向输出。
1、sprintf结合usart输出
sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。
函数原型
int sprintf( char *buffer, const char *format, [ argument] … );
参数列表:
buffer :char型指针,指向将要写入的字符串的缓冲区。
format :格式化字符串。
[argument]... :可选参数,可以是任何类型的数据。
通过sprintf把想要输出的数据格式化为字符串数据,再调用Usart1_SendStr就能输出任意想要输出的数据了。
2、使用MicroLIB调用printf输出
勾选Use MicroLIB,调用printf,再开启半主机模式,就可以输出数据了。但是使用MicroLIB存在bug,在跑操作系统时偶尔会出现死机的现象,所以这种方法不推荐使用。
3、重定向输出
在Keil的下载路径下找到Retarget.c文件,打开并复制整个文件,粘贴到串口源文件中,做一定的修改,如下所示。
#pragma import(__use_no_semihosting_swi)
struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;
int fputc(int ch, FILE *f) {
while((USART1- >SR & (1< < 7)) == 0);
USART1- >DR = ch;
return ch;
}
int ferror(FILE *f) {
/* Your implementation of ferror */
return EOF;
}
void _sys_exit(int return_code) {
while (1); /* endless loop */
}
修改完成后,就可以直接调用printf输出任意类型的数据了。这种方法跑操作系统时不会有bug,为了避免后期跑操作系统出现死机或其它bug,推荐使用这种重定向输出的方法。
全部0条评论
快来发表一下你的评论吧 !