printf()函數(shù)重定向到STM32串口輸出
掃描二維碼
隨時(shí)隨地手機(jī)看文章
最近遇到需要MCU輸出數(shù)字的問(wèn)題,而STM32的串口輸出的是字符型,最先想到的方法是將整型數(shù)據(jù)轉(zhuǎn)換為字符型輸出,C庫(kù)函數(shù)中提供了相關(guān)的函數(shù)
參考:http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html
http://c.biancheng.net/cpp/html/1573.html
C語(yǔ)言中使用printf()函數(shù)輸出是非常方便功能非常強(qiáng)大的,如果能將printf()函數(shù)使用到串口上,能實(shí)現(xiàn)非常多的強(qiáng)大輸出功能,極大方便我們使用串口輸出功能。
printf()函數(shù)是輸出到顯示器,而MCU是沒(méi)有顯示器的,要使他輸出到串口,需要重定向該函數(shù)
printf()函數(shù)中調(diào)用fputc()函數(shù),只要對(duì)該函數(shù)進(jìn)行重定向,即可實(shí)現(xiàn)功能
//使用printf()函數(shù)要添加頭文件“stdio.h"
#include "stdio.h"
//printf()函數(shù)重定向到USART2
int fputc(int ch,FILE *f)
{
//ch送給USART
USART_SendData(USART2, ch);
//等待發(fā)送完畢
while(!USART_GetFlagStatus(USART2, USART_FLAG_TC)) ;
//返回ch
return ch;
}
庫(kù)函數(shù)中有宏定義
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
所以也可以寫(xiě)為
PUTCHAR_PROTOTYPE
{
//ch送給USART1
USART_SendData(USART2, ch);
//等待發(fā)送完畢
while(!USART_GetFlagStatus(USART2, USART_FLAG_TC)) ;
//返回ch
return ch;
}
完整原文(網(wǎng)上copy來(lái)的,這個(gè)是定向到USART1):
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
但是這樣做之后在KEIL中仍然不能正常輸出,網(wǎng)上查到原因是printf()函數(shù)使用標(biāo)準(zhǔn)庫(kù),標(biāo)準(zhǔn)庫(kù)中包括printf()等函數(shù)使用了半主機(jī)模式,導(dǎo)致無(wú)法運(yùn)行(見(jiàn)參考)
解決辦法:
1,使用微庫(kù),在工程屬性的Target->Code Generation中勾選Use MicroLIB
2, 重新實(shí)現(xiàn)庫(kù)中某些函數(shù),避免使用標(biāo)準(zhǔn)庫(kù)(見(jiàn)參考)
參考:http://blog.csdn.net/wdscq1234/article/details/7944036
http://www.openedv.com/posts/list/3172.htm