STM32中printf與scanf的重定向問題
關(guān)于STM32中 printf 與 scanf 的重定向問題在此我僅對不使用 "USE MircoLIB" 的情況做整理(針對Keil RVMDK開發(fā)環(huán)境)。
① :首先需要在 usart.h 中包含 “stdio.h” 頭文件
② :在 usart.c 中,加入如下代碼塊,以此避免使用半主機模式,并重定向 printf 和scanf 函數(shù);
#if1
#pragmaimport(__use_no_semihosting_swi)
/*標準庫需要的支持函數(shù),use_no_semihosting_swi以避免使用半主機模式*/
struct__FILE
{
inthandle;
};
FILE__stdout;
FILE__stdin;
/*重定向Printf函數(shù)*/
intfputc(intch,FILE*f)
{
return(SendChar(ch));
}
/*重定向Scanf函數(shù)*/
intfgetc(FILE*f)
{
return(SendChar(GetKey()));
/*調(diào)用scanf()在串口中輸入數(shù)據(jù)時,必須以空格結(jié)束,否則無法完成發(fā)送*/
}
void_ttywrch(intch)
{
SendChar(ch);
}
int_ferror(FILE*f){
/*Yourimplementationofferror*/
returnEOF;
}
//定義_sys_exit()以避免使用半主機模式
void_sys_exit(intreturn_code){
//x=x;
label:gotolabel;
}
#endif
③ :在 usart.c 中添加SendChar()與GetKey()函數(shù)
intSendChar(intch)
{
while(!(USART1->SR&USART_FLAG_TXE));
USART1->DR=(ch&0x1FF);
returnch;
}
intGetKey(void)
{
while(!(USART1->SR&USART_FLAG_RXNE));
return((int)(USART1->DR&0X1FF));
}
完成以上三步,即可實現(xiàn)printf()函數(shù)與scanf()的串口重定向,將標準輸入輸出流的來源或去向改為串口。
關(guān)于第二步所使用的避免使用半主機模式的代碼,其實Kei已經(jīng)為我們寫好了一個Retarget.c文件,在Keil/ARM/Startup目錄下.
另外本文針對的開發(fā)環(huán)境為Keil RVMDK,本人在Emblocks開源開發(fā)工具中實驗時,本方法是無法實現(xiàn)printf和Scanf的重定向的,以及在開源工具下如何"Use microLIB"的問題都有待進一步探討。