print输出重定向

什么是重定向

在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;
}

解析:

  1. 芯片有多个串口,先明确是哪个串口,也就是串口定义,此处是结构体指针定义:
USART_TypeDef* USARTx = USART1;
  1. 通过结构体指针指向DR的地址:
USARTx->DR = char;//char是fputc()的参数
  1. DR的数据是否发送完成,或者说DR里面
    是否有数据,我们需要通过另一个串口寄存器——SR的bit7来查看。

    bit7为1,则DR里面无数据,
    bit7为0;则DR里面有数据。

    则当DR有数据发送时,通过读取SR的bit7来等待发送完成

while((USARTx->SR & (1<<7) == 0))
  1. 将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;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值