找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17852|回复: 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 单片机教程网

快速回复 返回顶部 返回列表