本文前提:读者已经知道如何用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