在前兩天介紹的串口輸出中,函數(shù)Usart1_SendStr只能輸出字符串,如果想輸出一個整型或者其他類型的數(shù)據(jù),單獨(dú)用這個函數(shù)是不能實(shí)現(xiàn)的。今天跟大家簡單介紹下格式化輸出,讓輸出不再只有字符串。
格式化輸出有****3種方法 :sprintf結(jié)合usart輸出;使用MicroLIB調(diào)用printf輸出;重定向輸出。
1、sprintf結(jié)合usart輸出
sprintf指的是字符串格式化命令,主要功能是把格式化的數(shù)據(jù)寫入某個字符串中。sprintf 是個變參函數(shù)。
函數(shù)原型
int sprintf( char *buffer, const char *format, [ argument] … );
參數(shù)列表:
buffer :char型指針,指向?qū)⒁獙懭氲淖址木彌_區(qū)。
format :格式化字符串。
[argument]... :可選參數(shù),可以是任何類型的數(shù)據(jù)。
通過sprintf把想要輸出的數(shù)據(jù)格式化為字符串?dāng)?shù)據(jù),再調(diào)用Usart1_SendStr就能輸出任意想要輸出的數(shù)據(jù)了。
2、使用MicroLIB調(diào)用printf輸出
勾選Use MicroLIB,調(diào)用printf,再開啟半主機(jī)模式,就可以輸出數(shù)據(jù)了。但是使用MicroLIB存在bug,在跑操作系統(tǒng)時偶爾會出現(xiàn)死機(jī)的現(xiàn)象,所以這種方法不推薦使用。
3、重定向輸出
在Keil的下載路徑下找到Retarget.c文件,打開并復(fù)制整個文件,粘貼到串口源文件中,做一定的修改,如下所示。
#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 */
}
修改完成后,就可以直接調(diào)用printf輸出任意類型的數(shù)據(jù)了。這種方法跑操作系統(tǒng)時不會有bug,為了避免后期跑操作系統(tǒng)出現(xiàn)死機(jī)或其它bug,推薦使用這種重定向輸出的方法。
-
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355728 -
printf函數(shù)
+關(guān)注
關(guān)注
0文章
31瀏覽量
5890 -
USART串口
+關(guān)注
關(guān)注
0文章
32瀏覽量
6818
發(fā)布評論請先 登錄
相關(guān)推薦
評論