STM32 printf()函数和scanf()函数重定向到串口

在STM32中使用printf函数 实际上的printf函数就是一个串口输出函数,只不过它相比之前我们直接调用串口发送函数更加方便、更加实用,无非是在GPIO的定义与初始化上有点儿区别。因此,我们完全可以将printf函数看成一个串口发送函数。... 阅读详情
AI摘要

学习STM32时,常需用串口测试代码,要用到printf()和scanf()函数,但它们默认不能输出到串口助手,需进行重定向。介绍了两个函数的底层函数接口及重定向函数的编写,还提醒使用时要包含头文件、勾选微型库,工程完成后可去掉。

#printf()函数和scanf()函数重定向
在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到printf()函数或者scanf()函数,但是printf()这个函数是格式化输出到屏幕的,scanf()函数又是格式化输入(从屏幕),并不能输出到串口助手中,所以需要进行重定向。


在系统中有三个标准文件:标准输入,标准输出,标准错误。
***printf : 强大的格式化转换(可以将任何类型转为字符串)。 ***
scanf : 强大的格式化转换(可以将字符串类型转为任何类型)。


要重定向,首先要找到底层函数:
1.printf()函数的底层函数接口:在头文件<stdio.h>中第620行左右处,
这里写图片描述
找到这个函数后,就可以开始写函数了

int fputc(int c, FILE *stream)
{
	USART1->DR = c;//将c赋给串口1的DR寄存器,即重定向到串口,也可以是其他的接口
	while(!(USART1->SR & (1 << 7))){};//等待数据发送完成
	return c;
}

2.scanf()函数的底层函数接口:在头文件<stdio.h>中第595行左右处,
这里写图片描述
重定向函数如下:

int fgetc(FILE *stream)
{
	while(!(USART1->SR & (1 << 5))){};//等待数据接收完成
	return USART1->DR;
}

写好这两个函数后就可以在其他。.c文件中使用printf()函数将数据打印到串口调试助手了,当然也可以使用scanf()函数从串口调试助手输入数据。和C语言中的使用如出一辙,一毛一样!

值得注意的是:1.在头文件<stdio.h>中已经有fgetc()和fputc()这两个函数,为什么又可以再写这两个函数呢?难道不会产生重定义的错误吗?其实头文件<stdio.h>是在微信C语言库中,简称微型库。学过C语言的就知道,C代码在运行的时候,会优先在当前的.c文件中查找这两个函数,没有的话就会从系统默认的路径下查找。
使用printf()和scanf()时要包含头文件<stdio.h>,微型库也要勾选上,如下图:
这里写图片描述
2.勾选上微型库再进行编译的时候,会发现多了几KB的代码,在工程完成的时候就没必要再勾选上,再者,printf()函数仅仅是方便调试,在工程完成的时候也应该去掉!

STM32中printf与scanf的重定向问题 关于STM32中 printf 与 scanf 的重定向问题在此我仅对不使用 "USE MircoLIB" 的情况做整理(针对Keil RVMDK开发环境)。 ① :首先需要在 usart.h 中包含 “stdio.h” 头文件 ② :在 usart.c 中,加入如下代码块,以此避免使用半主机模式,并重定向 printf 和scanf 函数; #if 1 #pragma im 阅读详情

相关推荐

STM32 串口 UART 实现 printf scanf

ARC STM32 UART,串口实例, 实现 printf, scanf, 使用标准库

STM32 printf 和 scanf 函数重定向

1. 方法一 /// 重定向c库函数printf到USART1 int fputc(int ch, FILE *f) { /* 发送一个字节数据到USART1 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) =...

guaizaiguaizai的博客 4716

F5高可用HA配置详情

F5 HA详细配置

weixin_45843944的博客 3026

关于STM32使用scanf /printf输出输入重定向

摘要:关于stm32G030,使用c库函数scanf/printf,重定向的分享

luan_qd的博客 1528

Unity 2021 LTS安装避坑指南:从下载到第一个3D项目的完整流程

本文提供了一份详尽的Unity 2021 LTS安装与首个3D项目创建指南。内容涵盖从Unity Hub下载、版本选择、模块安装避坑,到编辑器界面解析、创建旋转立方体脚本的完整流程,旨在帮助初学者快速搭建稳定开发环境并上手核心操作。

mango的博客 311

深入解析JESD204B Subclass 1中的SYSREF与LMFC同步机制

本文深入解析了JESD204B Subclass 1协议中的核心同步机制,重点阐述了SYSREF信号如何作为系统级参考,对齐所有设备内部的本地多帧时钟(LMFC),从而实现高速多通道数据采集系统中的确定性延迟。文章结合实战经验,详细说明了硬件设计、时序要点及软件配置流程,是解决多ADC芯片同步对齐问题的关键指南。

weixin_29271263的博客 398

STM32串口实验中重定向c库中的printf()函数和scanf()函数

在STM 32 的串口实验中,往往需要把内容打印输出在串口调试助手中,这时就需要重定向c库中的printf()函数,重定向后可使用。 注意下面的FILE的定义在头文件stdio.h中,所以在写程序时需要包含此头文件。 例: int fputc(int ch,FILE *f) {     USART_SendData(USART_TypeDef* USARTx, uint8_t Data)...

weixin_42621509的博客 4771

DEA各种模型原理及stata代码实现

DEA各种模型原理及stata代码实现DEA各种模型原理及stata代码实现一、CCR和BCC1.原理2.效率测算stata代码3.Malmquist指数3.1M指数3.2Global-Malmquist指数4.指数计算代码与案例二、SBM模型1.原理2.stata代码实现三、方向性距离函数(DDF)1.原理2.stata代码实现3.非径向DDF模型(NDDF)3.GML指数4.指数测算四、总结 DEA各种模型原理及stata代码实现 一、CCR和BCC 1.原理 CCR模型产出导向下的效率通过求解以下规划

wonder1322的博客 4万+

STM32L152RC 在keil4中使用printf()和scanf() 函数

STM32L152RC 在keil4中使用printf()和scanf函数1、在keil中配置使用Micro LIB,如下图2、配置USART模块 void SYS_USARTInit(void) { static USART_InitTypeDef USART_InitStructure; static GPIO_InitTypeDef GPIO_InitStructure; USART

jnu_fangzebin的专栏 3144

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

智能客服系统知识库数据清洗

数据清洗(Data Cleaning)是确保智能客服知识库高效运行的重要环节,主要涉及。| 分类 & 标签优化 | 重新组织 FAQ,创建关键字索引 || 定期更新 | 结合用户反馈,每 1-3 个月优化 |才能提供更优质、正确的回答,提升客户满意度!、Zendesk、Intercom 等)中,: FAQ 或客服回答中可能存在。,会影响 AI 匹配的准确性。是一个持续优化的过程,

z1941563559的博客 2099

USART1 串口使用 printf 函数

USART1 串口使用 printf 函数

weixin_46430043的博客 1229

【Basis】Lumerical licence center 无法连接的问题

端口,我们需要确认该端口是否被其他程序占用。这里我们将介绍如何处理这一问题。后,今天电脑更新后我无法打开。终结占用该端口的程序后再次打开。

u011699626的博客 314

USART重定向——利用printf,scanf向上位机输出输入信息

如果大家C语言学的不错的话,应该会知道printf()的底层调用了 fputc( )。是有fputc()来向屏幕中打印数据的。

2501_93739217的博客 283

高电压技术的面试内容整理(详细版本:57题)

涵盖了高电压技术的关键领域,包括气体放电的物理过程、液体和固体介质的绝缘特性、高压外绝缘的分类与特性、电气设备绝缘试验的方法与原理、电力系统的防雷保护措施,以及内部过电压的产生、影响与限制方法,为理解和应对高电压环境下的电气问题提供了系统的知识框架。通过深入探讨气体放电理论、介质极化与损耗、绝缘子的电气特性、绝缘试验技术、防雷策略以及内部过电压的管理。

weixin_44808274的博客 777

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32学习 1 ----串口通讯--阻塞式收发+支持printf

一、MicroLib微库和ARM标准C库有什么区别?MicroLib是针对以C语言编写的基于ARM嵌入式应用程序的。与ARM Compiler工具链附带的标准C库相比,MicroLib具有明显的代码大小优势。下图可见微库在不同内核下代码量明显少很多:微库函数也是一种函数,其很多库函数原型在网上都能找到,如果你有特殊需求,可以不用微库,在库函数原型的基础上进行修改。比如:你的项目经过验证,发现微库的代码量,或者运行速度都不理想的情况下,可以自己修改原型函数。当然,在万不得已的情况下才建议修改原型函数。

heanyu的专栏 269

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32 在PC端串口助手上打印中文字符----printf()函数重定向

前言 本博文基于STM32F103ZET6和MDK5.2.6和库函数V3.5.0开发; 本博文采用七星虫德飞莱开发板,USB-TTL电路,USART1和野火串口调试助手; 如有不足,多指教; 串口通信作为拓展单片机功能的一个外设,其本身还有一个常用的功能就是用于调试使用,通过对一个值的输出从而观察所要的值是否正确,比较形象,但是自己在写串口的时候写出来的程序不能像当初VC++里的C语言一样利用...

small_is_powerful , small_is_beautiful 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

stm32f103串口printf,scanf函数串口重定向

串口重定向的步骤:首先配置USART串口(初始化这些)重定向函数 首先配置USART串口(初始化这些) 重定向函数 先看代码 uart.c中 #include <usart.h> #include <main.h> void usart2_init(unsigned long blud) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RC

qq_43106548的博客 2440

printf和scanf的串口重定向,格式化输入输出

MicroLib是对标准C库进行了高度优化之后的库,供MDK默认使用,相比之下,MicroLIB的代码更少,资源占用更少,在MDK编译环境下可以使用其MicroLib,快速实现printf重定向;1)勾选Use MicroLib,使用半主机模式2)重定义fputc到串口此函数原本是将 字符ch 打印到文件指针 stream 所指向的文件流去的,现在我们不需要打印到文件流,而是打印到串口1。在 usart.c 中,重写fputc。

2301_76143875的博客 4577

在STM32中使用printf()和scanf

在STM32中使用printf()和scanf 本文出处: https://shawnhymel.com/1873/how-to-use-printf-on-stm32/ 作者:Shawn Hymel 内容来源于网络,本文只做翻译和学习,侵删。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0MS0xDg-1623856482643)(https://shawnhymel.com/wp-content/uploads/2019/08/stm32-retargeting.

Ethan-Code's blog 6029

STM32 中重定向printf 和 scanf

uart.c   如果使用#pragma import(__use_no_semihosting),则在MDK中不勾选use Microlib。当前代码直接重定向没使用#pragma import(__use_no_semihosting),故需要选择use Microlib。    #include "usart.h" #include #include #include "ad55

graduation201209的专栏 5445

STM32学习笔记 —— STM32CubeIDE+printf()和scanf()重定向+使能浮点

#include "stdio.h" #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #define GETCHAR_PROTOTYPE int __io_getchar(FILE *f) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #define GETCHAR_PROTOTYPE int fgetc(FIL

Vinson的专栏 6384

在STM32中快速运用scanf和printf函数

目录1、前言2、配置2.1、使用微库2.2 不使用微库 1、前言 在单片机开发调试中可能要输入输出一些数据,因此需要使用到printf和scanf函数。下边将部署的方法做快速说明,方便大家快速使用这两个函数进行开发调试。 2、配置 printf函数和scanf函数是“标准函数接口”。源代码不需要我们去实现,我们只需要做调用即可。两个函数在软件中实现功能,需要工程进行配置。配置主要分两种。 #mermaid-svg-e3eV7dGAKyfjvj73 .label{font-family:'trebuchet

Lin的博客 4545

【STM32+HAL库】---- 调试printf串口打印

只需要重新定义fputc函数,在fputc的函数中将数据通过串口发送,称之为:fputc重定向或者printf重定向。同理,只需要重新定义fputc函数,在scanf的函数中将数据通过串口接收,称之为:scanf重定向

欢迎来到我的博客 7149
上一篇: 二维数组动态分配内存
下一篇: KEIL生成 bin文件的方法
追代码的人
博客等级 码龄9年 93粉丝 13原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追代码的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值