在stm32等单片机中使用printf函数,将printf函数打印的显示到串口,需要进行重定向,因为printf函数默认输入是屏幕,单片机没有屏幕,故需要使用重定向。
Fputc跟printf的关系,fputc是printf函数的底层。Printf函数打印时就是不断调用fputc函数一个个打印的,将fputc函数重定向到串口,printf就输出到了串口。
步骤如下:
1、使用printf前勾选:MicroLIB 是keil为嵌入式平台优化的一个精简库
2、头文件添加 include<stdio.h>
3、对fputc 函数进行重写,代码如下:
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (unsigned char)ch;
return ch;
}
#endif
在使用stm32串口收发数据时,可使用下面这段代码:
void Serial_SendByte(uint8_t Byte) //发送单个数据
{
USART_SendData(USART1, Byte);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待标志位,避免数据重复
//这里标志位不需要手动清零
}
int fputc(int ch, FILE *f) //对printf进行重定位,单个串口时可用
{
Serial_SendByte(ch);
return ch;
}
具体可根据实际需要进行修改。