嵌入式硬件中Printf函数的原理

news2025/1/12 3:50:15

作为嵌入式单片机领域小白的我,在查阅STM32、MSP432等串口通信的开发例程时,

总是能看到用  printf()这个函数来进行串口的发送功能。

目录

有关printf()函数需要解决的疑问:

一、printf()函数工作原理:

C语言中为何能调用printf()函数打印数据到控制台中?

我们该如何找到这个函数呢?

此处贴出fgetc()函数 以及  fputc()函数的定义:

UART_transmitData(,);函数的定义与作用:


有关printf()函数需要解决的疑问:

1.printf()这个函数  是怎么向上位机打印字符串的?

2.printf()这个函数  该如何设置用 哪个串口向上位机打印字符的?

3.printf()这个函数  它与普通的串口发送函数有哪些区别?

  USART_SendData是一个一个发送,printf本质也是一样

4.我该怎么对  printf()这个函数  进行自己的更改?

5.为何 printf()这个函数  能格式化输出 数据?

1,printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
2,printf()函数的调用格式为: printf("<格式化字符串>", <参量表>)。
3,格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。要输出的的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。
4,作用:在c语言中产生格式化输出的函数(定义在 stdio.h 中),其向终端(显示器、控制台等)输出字符。

其中有关Printf()设置方面的问题,我将在下文研究分析:

网络上有很多关于STM32的printf()这个函数的资料,因此此处归纳一下MSP432的:

一、printf()函数工作原理:

C语言中为何能调用printf()函数打印数据到控制台中?

是因为其调用了fputc()函数

我们该如何找到这个函数呢?

最快的就是找个地方打出fputc,然后鼠标右键找到定义即可,此处发现该函数定义在了

usart.h文件中。

此处贴出fgetc()函数 以及  fputc()函数的定义:

fgetc()函数应该是 对应被 scanf()函数 调用.

fputc()函数应该是 对应被 printf()函数 调用.

int fgetc(FILE *f)
{
  while (EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG !=
         UART_getInterruptStatus(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG))
    ;
  return UART_receiveData(EUSCI_A0_BASE);
}
#endif
int fputc(int ch, FILE *f)
{
  UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);
  return ch;
}
/*****************   函数说明   *****************
 *
 * 以上两条对接标准输入输出库的函数:
 * int fputc(int ch, FILE *f);
 * int fgetc(FILE *f);
 * 源码为BiliBili平台UP主 “CloudBoyStudio” 编写
 * 本人RNA,不是作者
 * 在此也表感谢

我们发现,fputc()函数它有俩个参数传入,int fputc(int ch, FILE *f)

这俩个参数在fputc()函数的本体中,是被用在 UART_transmitData(,);函数里了:

int fputc(int ch, FILE *f)
{
  UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);
  return ch;
}

UART_transmitData(,);函数的定义与作用:

void UART_transmitData(uint32_t moduleInstance,uint_fast8_t transmitData);
//将数据放入传输数据寄存器,以开始传输,transmitData为待传输的数据
//UCAxTXBUF寄存器


发现他需要传入俩个参数:

uint32_t moduleInstance  和  uint_fast8_t transmitData

uint32_t moduleInstance从以下的定义说明可以看出,他指的是需要选择的串口

//! \param moduleInstance is the instance of the eUSCI A (UART) module.
//! Valid parameters vary from part to part, but can include:
//!         - \b EUSCI_A0_BASE        eUSCI A0基地址
//!         - \b EUSCI_A1_BASE        eUSCI A1基地址
//!         - \b EUSCI_A2_BASE        eUSCI A2基地址
//!         - \b EUSCI_A3_BASE        eUSCI A3基地址

uint_fast8_t transmitData 是一个指向某个结构体的指针:

他指向的是 stdio.h 中的 FILE结构体.也许这就是 fputc()函数与printf()函数 联系起来的地方:

 经过以上的介绍,我们就能对printf()函数进行自定义操作了。

原理就是对fputc();函数做一些相应的串口寄存器的选择方面的更改就行了。

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

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

相关文章

34种ArcGIS常用操作技巧大汇总

概述 ArcGIS产品线为用户提供一个可伸缩的&#xff0c;全面的GIS平台。ArcObjects包含了许多的可编程组件&#xff0c;从细粒度的对象&#xff08;例如单个的几何对象&#xff09;到粗粒度的对象&#xff08;例如与现有ArcMap文档交互的地图对象&#xff09;涉及面极广&#x…

iperf3常用

iperf使用方法详解 iperf3是一款带宽测试工具&#xff0c;它支持调节各种参数&#xff0c;比如通信协议&#xff0c;数据包个数&#xff0c;发送持续时间&#xff0c;测试完会报告网络带宽&#xff0c;丢包率和其他参数。 安装 sudo apt-get install iperf3iPerf3常用的参数&am…

六、数据仓库详细介绍(ETL)方法篇

0x00 前言 上文我们把数据仓库类比我们人类自身&#xff0c;数据仓库“吃”进去的是原材料&#xff08;原始数据&#xff09;&#xff0c;经过 ETL 集成进入数据仓库&#xff0c;然后从 ODS 开始逐层流转最终供给到数据应用&#xff0c;整个数据流动过程中&#xff0c;在一些关…

【JAVAEE】Java中的文件基础

目录 1.文件 1.1什么是文件 1.2文件路径 2.Java中操作文件 File类中常见的属性 File类中常见的构造方法 File类中常见的方法 3.文件内容的读写---数据流 按字节进行数据读InputStream FileInputStream 按字节进行数据写OutputStream 按字符进行数据读FileReader 按…

【JavaSE】Java基础语法(一)

文章目录 1. ⛄常量2. ⛄数据类型2.1 &#x1f320;&#x1f320;计算机存储单元2.2 &#x1f320;&#x1f320;Java 中的数据类型 3. ⛄变量的注意事项4. ⛄键盘录入5. ⛄标识符 1. ⛄常量 常量&#xff1a;在程序运行过程中&#xff0c;其值不可以发生改变的量。 Java中的常…

2023年我要在深圳考CPDA数据分析师认证,含金量如何?

CPDA数据分析师认证是大数据方面的认证&#xff0c;助力数据分析人员打下扎实的数据分析基础知识功底&#xff0c;为入门数据分析保驾护航。 帮助数据分析人员掌握系统化的数据分析思维和方法论&#xff0c;提升工作效率和决策能力&#xff0c;遇到问题能够举一反三&#xff0c…

opencv图像灰度化

图像灰度化就是将图像的亮度值&#xff08;R,G,B&#xff09;按照一定的方式映射到0-255之间的灰度值上&#xff0c;为了使图像看起来不那么单调&#xff0c;需要将图像的亮度值进行变换。下面简单介绍下 opencv中的灰度化函数&#xff1a; 1、先将图像的像素值转换为R,G,B三个…

手机也可以搭建博客?安卓Termux+Hexo搭建属于你自己的博客网站 - 公网远程访问

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并…

【Linux】信号集及相关函数(sigemptyset、sigfillset、sigprocmask)

目录 1、信号集2、自定义信号集相关函数3、sigprocmask函数函数解析代码举例 橙色 1、信号集 多个信号组成的一个集合称为信号集&#xff0c;其系统数据类型为 sigset_t 。 在 PCB 中有两个非常重要的信号集&#xff0c;一个称为“阻塞信号集”&#xff0c;另一个是“未决信号…

Charles 抓包工具下载安装及基础使用

在Charles抓包工具之前讲过了Fiddler抓包工具&#xff0c;在讲之前先来解决读者的该怎么读这两个单词&#xff08; Charles 读&#xff1a;雀奥斯 和 Fiddler 读&#xff1a;非的了 &#xff09;&#xff0c;下面进入正题&#xff0c;有使用过抓包工具的或者看过之前关于Fiddle…

leecode530—二叉搜索树的最小绝对差

leecode530 二叉搜索树的最小绝对差 &#x1f50e;首先要知道二叉搜索树是有序的&#xff0c;补充一下二叉搜索树的相关概念。 &#x1f7e0; 对于 BST 的每一个节点 node&#xff0c;左子树节点的值都比 node 的值要小&#xff0c;右子树节点的值都比 node 的值大。 &#x1f…

数据分析笔记:基本概念,常用图表,报告大纲

1.数据分析 1.1定义 对数据进行分析。数据分析是为了提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。在实际工作中&#xff0c;帮助管理者判断和决策。 1.2步骤 数据分析的基本步骤包括明确思路&#xff0c;制定计划、数据收集、数据处理、数据分析、数据显…

chatgpt赋能Python-python_kanren

Python Kanren&#xff1a;一种强大的逻辑编程工具 Python Kanren是一种基于Python的逻辑编程工具&#xff0c;它可以帮助开发人员轻松地构建复杂的逻辑应用程序。如果您正在寻找一种可以帮助您更快地开发和测试逻辑代码的工具&#xff0c;那么Python Kanren绝对是一个不错的选…

MySQL 用户管理

目录 用户管理 用户 用户信息 创建用户 删除用户 修改用户密码 数据库的权限 给用户 注意&#xff1a;如果发现赋权限后&#xff0c;没有生效&#xff0c;执行如下指令&#xff1a; 回收权限 用户管理 如果我们只能使用 root 用户&#xff0c;这样存在安全隐患。这时…

有没有高清录制视频软件?如何录制清晰的视频?

案例&#xff1a;录屏画质模糊影响观看怎么办&#xff1f; 【我把我在电脑上的操作录制了下来&#xff0c;录屏虽然可以看清楚操作的步骤&#xff0c;但是画质比较模糊&#xff0c;看起来很不舒服。有没有什么方法可以录制清晰画质的视频&#xff1f;】 当今数字化时代&#…

Ubutun安装Anconda3

一、下载Anconda 方法一&#xff1a;官网下载 https://www.anaconda.com/download&#xff08;比较费时&#xff09; 可以点击右键复制地址 使用Wget下载 wget https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh方法 2&#xff1a;清华源 在清华大…

Shell运维实战2-条件判断与函数

目录 Shell 条件测试与比较脚本条件测试文本测试表达式字符串测试表达式整数二元比较操作符逻辑操作符区别总结 if 语句Shell 函数基础执行 Shell 条件测试与比较 脚本条件测试 # -f判断文件是否存在&#xff0c;如果存在返回真&#xff0c;反之为假 # 一下结构类似于三元运算…

Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化

1、MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Had…

如何在宝塔面板后的阿里云服务器运行Flask项目并公网可以访问?

在你的服务器安装宝塔面板 宝塔面板是服务器运维管理系统 使用宝塔前&#xff1a; 手工输入命令安装各类软件&#xff0c;操作起来费时费力并且容易出错&#xff0c;而且需要记住很多Linux的命令&#xff0c;非常复杂。 使用宝塔后&#xff1a; 2分钟装好面板&#xff0c;一键…

二维码在中国:学术视角下的创新与实践

相关统计数据显示&#xff0c;全球每天要扫100亿个二维码&#xff0c;而中国的二维码应用占到全球九成左右&#xff0c;平均每人每天扫码6次以上。 作为万物互联时代的“数字身份证”&#xff0c;二维码在物流运输、生产制造、会议签到、移动支付、餐饮服务、资产管理、市场营…