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

news/2024/10/3 22:41:16

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

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67501.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

解决wsl 安装出现Installing, this may take a few minutes… 时间长。且重新打开进入root用户问题

1. 现象 在安装wsl出现 Installing, this may take a few minutes… 等待时间过长,无法启动,或报错。且如果你重新打开终端,出现图二情况(直接进入root用户)。 很显然,你的系统已经正确安装,但是你却跳过了创建用户的步骤,因此,只需要创建一个新用户,并将其设定为默认…

数据库——DQL单表查询

DQL单表查询id name gender age score111111 刘一 女 20 NULL186222 陈二 男 30 90275933 张三 女 24 92266055 李十四 男 20 92134444 王五 女 18 92225573 赵十六 男 22 94一、简单查询(SELECT...FROM...) 1.查询所有字段(*) --SELECT * FROM 表名; SELECT * FROM class…

数据库——DDL数据库和数据表的基本操作

DDL 一、数据库的基本操作 1、创建(CREATE) --CREATE DATABASE/SCHEMA [IF NOT EXISTS] 表名[指定数据库的字符集]; --创建名为my的数据库 CREATE DATABASE my; CREATE SCHEMA my;--如果名为my的数据库不存在则创建,避免了当数据库存在而发生的错误 CREATE DATABASE IF NOT EXI…

安卓Android虚拟机分享及使用

不知道大家伙在安装安卓虚拟机时被各式各样的问题折磨过没,我在安装安卓虚拟机时,遇到的问题简直就像长江之水源源不断,就算是最后安装好了也会因为各式各样的原因无法进入启动桌面。 当我发现这个可以直接导入到电脑一键开启运行的虚拟机时,今天我必须分享给大家!话不多说…

PotPlayer(免费媒体播放器) v1.7.22233.0 多语便携版

概述 PotPlayer是一款由韩国企业Daum开发的免费媒体播放器,它提供了丰富的功能和特点,使其成为许多用户的首选播放器。 软件功能 支持多种音视频格式:PotPlayer支持大多数常见的音视频格式,包括MP4、AVI、MKV、MOV、FLV、MP3、WAV等。高质量的音视频播放:PotPlayer采用了…

25赛季算法组第一阶段第二次培训(ubuntu安装与基本使用)

25赛季算法组第一阶段第二次培训 1. Ubuntu 的介绍 1.1. 操作系统和操作系统的选择 操作系统,英文名称Operating System,简称OS,是计算机系统中必不可少的基础系统软件,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心。 操作系统的作用是管理和控制计…

[Electron] 搭建 Vite+Electron 项目

安装 搭建 Vite 项目(根据官方文档搭建),安装 electron、nodemon。 pnpm install electron nodemon -D配置 electron/main.js file:[electron/main.js]import { app, BrowserWindow } from "electron";const createWindow = () => {const win = new BrowserWin…

多校A层冲刺 NOIP2024 模拟赛 01

T1 构造字符串 签到题 注意到 \(n\) 和 \(m\) 较小,直接扫一遍用并查集维护他所描述的情况,并将不同的位置记录下来,若存在不同的位置属于同一个集合则不可能构成,否则贪心从前往后取 mex 即可。 时间复杂度 \(O(nm\alpha(n))\) 。 T2 寻宝 签到题 首先先用并查集将大联通块…