【STC15】实现printf()重定向的可能出现的问题的解决
1.【STC15 学习笔记】【转载】51单片机学习教程(简单入门)2.【STC15 学习笔记】Proteus仿真3.【STC15 学习笔记】8051 中断号简介4.【STC15 学习笔记】细说STC15单片机I/O口的四种工作模式5.【STC15】单片机中常说的 1T 和 12T 的意思6.【STC15】面向对象的.h/.c程序架构7.【STC15】内部RAM讲解(data/idata/xdata的区别)&全局变量的保存位置的设定8.【STC15】通过硬件PWM调整灯亮度9.【STC15】CCP PCA PWM区别10.【STC15】前后台方式实现按键的长按检测(面向对象)
11.【STC15】实现printf()重定向的可能出现的问题的解决
12.【STC15】系统低功耗状态机编程(面向对象思想)本文前提:读者已经知道如何用STC15实现串口重定向的基础知识(大体思路和代码大意)。
如果不知道,请移步:
- 《STC15单片机-串口打印》:https://blog.csdn.net/weixin_46251230/article/details/126679956
问题1:uint8_t 数字增长显示错误
/* Private variables----------------------------------------------------------*/
uint16_t Cnt = 0; //初始化自动加1的变量,printf()正确显示
uint8_t Cnt = 0; //初始化自动加1的变量,printf()会显示错误,程序+1,打印出来每次加256
如果Cnt的类型是uint8_t的话(如上所示),printf() 中为 %u 或者 %d 时,则串口输出的不是加1,而是加256。(很怪,但事实却是如此)
解决办法:
uint8_t 类型的变量,需要强制类型转换才会正常加1,并从0加到255,然后又从0开始。
printf("hello:%u\r\n",(uint16_t)Cnt++); //添加 (uint16_t)强制类型转换
问题2:改写putchar() 而不是 fputc()
注意:
网上文章许多都是说改写fputc函数,但我在这个程序中试了是不行的,会编译出错,定位到函数的FILE类型上,因为C51是没有FILE类型的,所以这里是使用不了fputc函数的
int fputc(int ch,FILE*stream) //编译时在FILE处报错
{
UART1.UART_SendData((uint8_t)ch);
return ch;
}
那为什么网上还有那么多说改fputc函数呢?因为那是在编写STM32单片机程序的时候,可以在keil软件的设置里,勾选Use MicroLIB选项,就可以使用fputc函数来实现重定向了
打开STM32工程文件时keil设置界面:

为什么使用microlib库
microlib 是缺省 C 库的备选库,它指在需要装入到极少量内存中的深层嵌入式应用程序配合使用,这些应用程序不在操作系统中运行。
microlib 进行了高度优化以使代码变得很小,它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。某些库函数的运行速度也比较慢,例如,memcpy()。
选微库之后,重写fputc函数和fgetc函数就可以支持printf函数和scanf函数。
但打开编写51单片机的程序时,keil软件设置里是没有这个选项的,所以51的程序没法使用fputc函数
打开51工程文件时keil设置界面:
而从keil的帮助文档里可以知道, printf 也是基于putchar实现的,所以本次重新实现putchar,就可以实现printf的重定向了
至于重定向的方法网上有很多,但为什么可以重定向,就比较少文章介绍,这里看到有一篇文章写的不错:https://zhuanlan.zhihu.com/p/133460085
参考资料:
《STC15单片机-串口打印printf重定向》
作者:ONE_Day|
链接:https://blog.csdn.net/weixin_46251230/article/details/126674934
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具