什么是重定向
在Windows下开发C程序,我们可以把数据通过C语言标准库的printf()输出到屏幕上,实现人机交互信息。
在嵌入式设备中,我们要将,诸如字符串、命令和文本等数据,从一个模块传输到另一个模块,而不再是输出到电脑屏幕上。
这时候,我们就需要重写控制printf()的函数,也就是int fputc(int char, FILE *stream) ,我们不需要到C标准库中去改写fputc()。
编译器编译的时候优先实现改写过的函数,这就是所谓的printf()重定向。
芯片串口怎么实行重定向功能
以stm32f103系列的芯片为例:要实现串口的printf重定向功能,就需要往串口寄存器,也就是往数据寄存器DR里面写数据,接着串口自动发送出去。
先看代码:
int fputc(int char, FILE *f)
{
USART_TypeDef* USARTx = USART1;
while((USARTx->SR & (1<<7))==0);
USARTx->DR = char;
return char;
}
解析:
- 芯片有多个串口,先明确是哪个串口,也就是串口定义,此处是结构体指针定义:
USART_TypeDef* USARTx = USART1;
- 通过结构体指针指向DR的地址:
USARTx->DR = char;//char是fputc()的参数
-
DR的数据是否发送完成,或者说DR里面
是否有数据,我们需要通过另一个串口寄存器——SR的bit7来查看。bit7为1,则DR里面无数据,
bit7为0;则DR里面有数据。则当DR有数据发送时,通过读取SR的bit7来等待发送完成
while((USARTx->SR & (1<<7) == 0))
- 将while(USARTx->SR & (1<<7)==0);放在USARTx->DR = char前面;效率更高,因为DR一开始数据是空的,那么SR的bit7开始就是1,这样立马就能执行USARTx->DR = ch;而且不用一直等USARTx->DR = ch;发送数据,即while循环,执行完这个就可以去执行别的了。
while((USARTx->SR & (1<<7))==0);
USARTx->DR = char;