首页 > 其他分享 >【STC15】实现printf()重定向的相关问题

【STC15】实现printf()重定向的相关问题

时间:2024-10-03 22:33:50浏览次数:9  
标签:fputc 函数 STC15 uint8 printf 重定向

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

 

 

 

标签:fputc,函数,STC15,uint8,printf,重定向
From: https://www.cnblogs.com/FBsharl/p/18446087

相关文章

  • System.out.printf
    程序示例:importjava.util.Scanner;publicclassTest{publicstaticvoidmain(String[]args){System.out.print("请输入你的名字:");Scannerin=newScanner(System.in);Stringname=in.nextLine();System.out.print(&......
  • 1068:与指定数字相同的数的个数 【printf和scanf的非常正常用法】
    【题目描述】输出一个整数序列中与指定数字相同的数的个数。输入包含2行:第1行为N和m,表示整数序列的长度(N<=100)和指定的数字;第2行为N个整数,整数之间以一个空格分开。输出为N个数中与m相同的数的个数。【输入】第1行为N和m,表示整数序列的长度(N<=100)和指定的数字,中间用一个空......
  • 使用dup2实现一个简单的命令重定向
    以下是一个echo命令的的重定向的简单实现,大家可以把他改成main函数在执行,一样的,然后我们需要关注的部分就是代码中标有注释的代码块#include"command.h"int_echo(char*argv[]){ intargc=0; for(char**ptr=argv;*ptr!=NULL;ptr++) argc++; if(argc<2||......
  • sprintf_s strcat_s
    strcat_s函数原理:dst内存空间大小=目标字符串长度+原始字符串场地+‘\0’;获取内存空间大小使用sizeof函数(获取内存空间大小);获取字符串长度使用strlen函数(查字符串长度charsrc[1024]={"C/C++教程-strcat_s函数"};chardst[1024]={"www.codersrc.com"};//注意:str......
  • vue解决history路由模式刷新重定向问题(apache服务器)
    问题:vue文件打包后部署到apache服务器下,vue在history路由模式时,访问www.xx.com/about路径时刷新会导致notfount页面,这是因为www.xx.com/about目录不存在于服务器。解决:apche服务器重写路由到www.xx.com/下。然后刷新可正常访问到about页面apache开启路由重写1、配置文件......
  • 请求转发和重定向的区别
    今天讲一讲请求转发和重定向的区别,两者看起来其实很像,所以今天就好好区分一下两者的区别和使用场景。请求转发:请求转发和用户没有关系。对服务A发送的请求会被转发给另一个服务B,然后服务B响应给A,然后A再通过响应回来。响应码:2xx响应码,一般是200正常响应。URL:不会变化。......
  • 【GESP】C++一级练习BCQM3005,基本输出语句printf
    一道基础练习题,练习基本输出语句printf。BCQM3005题目要求描述输出表达式1234∗5678的结果。输入无输出1234∗5678=7006652输入样例无输出样例1234*5678=7006652全文详见个人独立博客:https://www.coderli.com/gesp-1-bcqm3005/【GESP】C++一级练习B......
  • 4.linux重定向和管道
    目录 一.重定向1.FD2.重定向案例><2.1输出>2.2输入<3.扩展二.管道1.管道|1.1进程管道Piping1.2tee管道2.参数传递Xargs 一.重定向 #touchtime#date>time.txt//>将本身输出到屏幕的东西给他弄到time文件中 1.FD-----标准输入、标准输......
  • Java Server Page动态包含与重定向
    一、动态包含需求:我希望能够在我的页面中包含一个音频分析:在页面被请求的时候动态地包含另一个JSP页面或者静态资源(如HTML页面、图片等)的内容。假设我已经有一个名为audio.jsp的页面。当服务器处理包含<jsp:includepage="audio.jsp"/>的JSP页面时,它会将audio.jsp页面的......
  • web群集--nginx实现重定向与重写操作的详细配置过程详与案例展示
    文章目录前言什么是重定向?重定向能做什么?何时需要重定向功能?nginx通过什么来实现重定向和重写操作的?nginx的重定向和重写有什么区别?案例展示重定向1.将所有对将所有对http://test.com的访问重定向到http://www.test.com重写将所有对http://test.com/old-path的访问......