开发过程中,我也是第一次遇到这样的问题,无语又无奈。
我们都知道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
打印下来数据流畅,而且正常显示。
上一篇:KEIL5中的options for Target
下一篇:STM32内存知识你真的了解吗?
推荐阅读最新更新时间:2024-11-20 11:34
设计资源 培训 开发板 精华推荐
- 使用 VIPer22A PWM 控制器的恒流 (700mA) LED 驱动器
- LTC3703-5 的典型应用 - 60V 同步开关稳压控制器
- NB6L11SMNGEVB:时钟或数据接收器评估板
- LTC1728ES5-2.5、3.3V 和 5V 三路电源监视器的典型应用
- 【单片机】电子琴电路设计
- 用于智能电表和PLC系统的,使用VIPER267KDTR的双路输出隔离式SSR反激转换器
- 【实物已验证】立创EDA涂鸦版万能遥控器V2.0版
- Si4825-A,入门级轮调 AM/FM/SW 接收器,单声道音频设计
- TDA75616LV 4 x 45 W 功率放大器的典型应用,具有完整的 I 2 C 诊断、SSR 和低电压操作
- FS86安全SBC编程插座板