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

news/2024/10/3 22:36:09/文章来源:https://www.cnblogs.com/FBsharl/p/18446087

本文前提:读者已经知道如何用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.hqwc.cn/news/807652.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库——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 寻宝 签到题 首先先用并查集将大联通块…

2024/10/3 CSP-S模拟赛20241003

A 恶心恶心恶心,赛时写了一个二分+线段树的复杂度错了,当时yzh和lyz就一会骗我一会说实话的,搞得很懵,自己水平也是菜,那线段树分析复杂度怎么不把递归次数乘上呢?大傻逼grz 思路其实还挺好的。 你考虑很容易就发现一个性质,如果一个区间内存在两个数互质的话,这个区间…

Android 简介

安卓 (Android) 是一种基于 Linux 内核的自由及开放源代码码的操作系统. 主要用于移动设备, 如智能手机和平板电脑, 由美国 Google 公司和开放手机联盟领导及开发. Android 操作系统最初由 Andy Rubin 开发, 主要支持手机. Android 是一种操作系统. Android 系统是开放源代码的…

listary

一、概述 Listary Pro 是一款功能强大的文件管理工具,通过快速搜索、文件夹导航、第三方应用集成和标签管理等功能,大大提升了用户的文件管理效率。无论是在工作中还是日常生活中,Listary Pro 都能成为用户不可或缺的助手。如果你还在为文件查找和管理而烦恼,不妨试试 List…

十、特殊应用:人脸识别和神经风格转换

1、One-Shot学习(One-shot learning)人脸识别所面临的一个挑战就是需要解决一次学习问题(one-shot learning problem),这意味着在大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。而历史上,当深度学习只有一个训练样例时,它的表现并…

python高级内置函数

filter函数返回迭代器