×
单片机 > 单片机程序设计 > 详情

printf()函数重定向到STM32串口输出

发布时间:2020-05-16 发布时间:
|

最近遇到需要MCU输出数字的问题,而STM32的串口输出的是字符型,最先想到的方法是将整型数据转换为字符型输出,C库函数中提供了相关的函数

参考:http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html

http://c.biancheng.net/cpp/html/1573.html


C语言中使用printf()函数输出是非常方便功能非常强大的,如果能将printf()函数使用到串口上,能实现非常多的强大输出功能,极大方便我们使用串口输出功能。


printf()函数是输出到显示器,而MCU是没有显示器的,要使他输出到串口,需要重定向该函数

printf()函数中调用fputc()函数,只要对该函数进行重定向,即可实现功能

//使用printf()函数要添加头文件“stdio.h"

#include "stdio.h"

//printf()函数重定向到USART2

int fputc(int ch,FILE *f)

{

//ch送给USART

USART_SendData(USART2, ch);

//等待发送完毕

while(!USART_GetFlagStatus(USART2, USART_FLAG_TC)) ;

//返回ch

return ch;   

}

库函数中有宏定义

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

所以也可以写为

PUTCHAR_PROTOTYPE

{

//ch送给USART1

USART_SendData(USART2, ch);

//等待发送完毕

while(!USART_GetFlagStatus(USART2, USART_FLAG_TC)) ;

//返回ch

return ch;    

}

完整原文(网上copy来的,这个是定向到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中仍然不能正常输出,网上查到原因是printf()函数使用标准库,标准库中包括printf()等函数使用了半主机模式,导致无法运行(见参考)

解决办法:

1,使用微库,在工程属性的Target->Code Generation中勾选Use MicroLIB

2, 重新实现库中某些函数,避免使用标准库(见参考)





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析