不得不说的USART中的重定向问题

开发过程中,我也是第一次遇到这样的问题,无语又无奈。
我们都知道printf要想在串口上打印,就需要重定向一下。

要想在串口1输出就重定向USART1,要想在串口2输出就重定向USART2。

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
		USART_SendData(USART1,(uint8_t)ch);
		return ch;
}

开发问题

这么简单谁不会呀!我在开发过程中竟然质疑了自己。
事情是这样的:
1.重定向到串口1,什么数据都不打印。
2.重定向的串口2,数据正常显示。
3.重定向到串口2,打印10几秒,数据不打印了(打印函数在循环里)
4.看着数据指示灯还在闪烁,可是串口就像卡了一样不打印数据了。

开始质疑

1.难道串口1重定向函数写错了?
2.为什么串口2可以用,串口1不可以用?
3.把串口2所有函数屏蔽了,串口1相关函数全打开为什么还不显示?
4.检查串口1配置,没错呀怎么还不显示?
5.串口2为什么显示一会又不显示了?

请叫我废物。

解决

1.实际上,代码都没写错。硬件问题,图纸上串口1给画上了,可是板子上并没有,我用万用表测量两个引脚电压,全为0。串口1能用就怪了.

2 .这个问题确实不常见,涉及到知识盲区了。

#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
int _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
		while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
		USART_SendData(USART2,(uint8_t)ch);

	return ch;

}

__use_no_semihosting:通知编译器不要从C库链接时使用带有半主机semihosting的函数,所以要避免使用半主机模式。
_sys_exit(int x) :前面一定要加返回类型,可以是void,也可以是int

在这里插入图片描述
打印下来数据流畅,而且正常显示。

总结

欢迎指正谢谢!
在这里插入图片描述

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值