发布时间:2018-08-15
最近遇到需要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, 重新实现库中某些函数,避免使用标准库(见参考)
参考:http://blog.csdn.net/wdscq1234/article/details/7944036
http://www.openedv.com/posts/list/3172.htm
热点排行