久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18736|回復: 1
打印 上一主題 下一主題
收起左側

如何用printf函數打印串口輸出數據

[復制鏈接]
跳轉到指定樓層
樓主
ID:91350 發表于 2015-10-29 17:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
       標準庫函數的默認輸出設備是顯示器,要實現在串口或LCD輸出,必須重定義標準庫函數里調用的與輸出設備相關的函數.
     例如:printf輸出到串口,需要將fputc里面的輸出指向串口(重定向),方法如下:
      只要自己添加一個int fputc(int ch, FILE*f)函數,能夠輸出字符就可以了
#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()之類的函數,使用了半主機模式。使用標準庫會導致程序無法運行,以下是解決方法:方法1.使用微庫,因為使用微庫的話,不會使用半主機模式. 如果使用的是MDK,請在工程屬性的“Target“-》”Code Generation“中勾選”Use MicroLIB“這樣以后就可以使用printf,sprintf函數了 方法2.仍然使用標準庫,在主程序添加下面代碼:  
FILE __stdout;   
在獨立應用程序中,您不太可能支持半主機操作。 因此,必須確保您的應用程序中沒有鏈接 C庫半主機函數。


問題:STM32如何使用printf函數進行串口輸出。  
解答:寄存器版的/庫函數版的
第一步,#inlcude "stdio.h"            
第二步,在主函數文件中重寫fputc()和fgetc()函數,如下:
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項中的Code Generation 選擇 UseMicroLIB。  即可使用printf進行串口輸出。
庫函數版本的:​
如果使用的是MDK,請在工程屬性的“Target“-》”CodeGeneration“中勾選”Use MicroLIB“ 進行如上設置后編譯一下,串口輸出正確的數據。   

#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的部分內容,省去了初始化的部分,自己看著寫好了
int fputc(int ch, FILE *f)//重新定向到串口發送出去的數據
{
      USART_SendData(USART1, (u8) ch);
      while(!(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == SET))
    {   }
     returnch;
}  
int fgetc(FILE *f)  //重新定向到串口接收到的數據
{
      while(!(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET))
   {   }
          return (USART_ReceiveData(USART1));}
注釋: fgetc 和 fgetc是c語言的標準函數(形參是標準的) FILE *f是文件指針,具備文件系統的操作系統有用。對于簡單的無文件系統的嵌入式系統無用。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:166543 發表于 2017-12-28 09:37 | 只看該作者
串口打印正在學習中。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕亚洲欧美 | 国产成人精品视频在线观看 | 国产一二区视频 | 免费在线观看av | 欧美成人a| 精品在线视频播放 | 日韩视频在线免费观看 | 国产1区2区3区 | 亚洲日本中文字幕在线 | 91视频麻豆 | 日韩一区av | 欧美xxxⅹ性欧美大片 | 亚洲国产精品一区二区三区 | 一区二区三区在线 | 欧 | 一区二区三区国产好 | 狠狠操狠狠色 | 97中文视频 | 久久美女网 | 亚洲欧美在线观看 | www九色| 国产欧美一区二区三区久久手机版 | 在线激情视频 | 国产99视频精品免费播放照片 | 成年人网站免费 | 免费福利视频一区二区三区 | 国产人成在线观看 | 综合久久综合久久 | 一级片网站视频 | 在线成人www免费观看视频 | 免费观看a级毛片在线播放 黄网站免费入口 | 特一级毛片 | 久久久综合精品 | 久久精品视频网站 | 亚洲一区二区三区在线视频 | 一级欧美一级日韩片免费观看 | 成人在线小视频 | 免费成人高清在线视频 | 国产一级免费视频 | 天天草狠狠干 | 国产精品久久久久久久久久久久午夜片 | 偷拍第一页 |