標(biāo)題: 如何用printf函數(shù)打印串口輸出數(shù)據(jù) [打印本頁(yè)]

作者: piaolin    時(shí)間: 2015-10-29 17:26
標(biāo)題: 如何用printf函數(shù)打印串口輸出數(shù)據(jù)
       標(biāo)準(zhǔn)庫(kù)函數(shù)的默認(rèn)輸出設(shè)備是顯示器,要實(shí)現(xiàn)在串口或LCD輸出,必須重定義標(biāo)準(zhǔn)庫(kù)函數(shù)里調(diào)用的與輸出設(shè)備相關(guān)的函數(shù).
     例如:printf輸出到串口,需要將fputc里面的輸出指向串口(重定向),方法如下:
      只要自己添加一個(gè)int fputc(int ch, FILE*f)函數(shù),能夠輸出字符就可以了
#ifdef __GNUC__  

#define PUTCHAR_PROTOTYPE int __io_putchar(intch)
#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;}
因printf()之類(lèi)的函數(shù),使用了半主機(jī)模式。使用標(biāo)準(zhǔn)庫(kù)會(huì)導(dǎo)致程序無(wú)法運(yùn)行,以下是解決方法:方法1.使用微庫(kù),因?yàn)槭褂梦?kù)的話,不會(huì)使用半主機(jī)模式. 如果使用的是MDK,請(qǐng)?jiān)诠こ虒傩缘摹癟arget“-》”Code Generation“中勾選”Use MicroLIB“這樣以后就可以使用printf,sprintf函數(shù)了 方法2.仍然使用標(biāo)準(zhǔn)庫(kù),在主程序添加下面代碼:  
FILE __stdout;   
在獨(dú)立應(yīng)用程序中,您不太可能支持半主機(jī)操作。 因此,必須確保您的應(yīng)用程序中沒(méi)有鏈接 C庫(kù)半主機(jī)函數(shù)。


問(wèn)題:STM32如何使用printf函數(shù)進(jìn)行串口輸出。  
解答:寄存器版的/庫(kù)函數(shù)版的
第一步,#inlcude "stdio.h"            
第二步,在主函數(shù)文件中重寫(xiě)fputc()和fgetc()函數(shù),如下:
int fputc (intch,FILE*f)
  {   
          while(!(USART1->SR & USART_FLAG_TXE));
         USART1->DR =(ch & 0x1FF);
        return (ch);}
int fgetc (FILE* f)  
{   
       while (!(USART1->SR& USART_FLAG_RXNE));   
        return((int)(USART1->DR &0x1FF));
}        
  第三步,工程屬性中的Target項(xiàng)中的Code Generation 選擇 UseMicroLIB。  即可使用printf進(jìn)行串口輸出。
庫(kù)函數(shù)版本的:​
如果使用的是MDK,請(qǐng)?jiān)诠こ虒傩缘摹癟arget“-》”CodeGeneration“中勾選”Use MicroLIB“ 進(jìn)行如上設(shè)置后編譯一下,串口輸出正確的數(shù)據(jù)。   

#ifndef __UART_INTERFACE_H
#define __UART_INTEFFACE_H  
#include "stm32f10x_lib.h"
#include "stdio.h"     
void UART_Init(unsigned long UART_baud);//波特率,如115200
int fputc(int ch, FILE *f);    //fputc重定向
int fgetc(FILE *f); //fgetc重定向  
#endif 下面是.C的部分內(nèi)容,省去了初始化的部分,自己看著寫(xiě)好了
int fputc(int ch, FILE *f)//重新定向到串口發(fā)送出去的數(shù)據(jù)
{
      USART_SendData(USART1, (u8) ch);
      while(!(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == SET))
    {   }
     returnch;
}  
int fgetc(FILE *f)  //重新定向到串口接收到的數(shù)據(jù)
{
      while(!(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET))
   {   }
          return (USART_ReceiveData(USART1));}
注釋: fgetc 和 fgetc是c語(yǔ)言的標(biāo)準(zhǔn)函數(shù)(形參是標(biāo)準(zhǔn)的) FILE *f是文件指針,具備文件系統(tǒng)的操作系統(tǒng)有用。對(duì)于簡(jiǎn)單的無(wú)文件系統(tǒng)的嵌入式系統(tǒng)無(wú)用。


作者: qwchen    時(shí)間: 2017-12-28 09:37
串口打印正在學(xué)習(xí)中。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1