您现在的位置: 主页 > MCU > 单片机技术应用 > printf()函数重定向到STM32串口输出 -
本文所属标签:
为本文创立个标签吧:

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

来源: 网络用户发布,如有版权联系网管删除 2018-09-06 

[导读]最近遇到需要MCU输出数字的问题,而STM32的串口输出的是字符型,最先想到的方法是将整型数据转换为字符型输出,C库函数中提供了相关的函数参考:http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html

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

本文引用地址: http://www.21ic.com/app/mcu/201808/779027.htm

参考: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, 重新实现库中某些函数,避免使用标准库(见参考)

参考:http://blog.csdn.net/wdscq1234/article/details/7944036

http://www.openedv.com/posts/list/3172.htm




              查看评论 回复



嵌入式交流网主页 > MCU > 单片机技术应用 > printf()函数重定向到STM32串口输出 -
 

"printf()函数重定向到STM32串口输出 -"的相关文章

网站地图

围观()