STM32学习和实践笔记(28):printf重定向实验

1.printf重定向简介

  在C语言中printf函数里,默认输出设备是显示器,如果想要用这个函数将输出结果到串口或者LCD上显示,就必须重定义标准库函数里中printf函数调用的与输出设备相关的函数。

比如要使用printf输出到串口,需要先将fputc函数里面的输出指向串口,这个更改就叫重定向。

 那么如何让STM32使用printf函数呢?

int fputc(int ch,FILE *p)  //在使用printf函数时会自动调用这个函数

{

  USART_SendData(USART1,(u8)ch); //将此处原来的显示器改为USART1

  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

  return ch;

}

2.printf函数格式

  printf("<格式化字符串>", <参量表>);

常用格式化规定字符如下:

%d     按照十进制整型数打印

%6d    按照十进制整型数打印,至少6个字符宽

%f     按照浮点数打印

%6f    按照浮点数打印,至少6个字符宽

%.2f   按照浮点数打印,小数点后有2位小数 

%6.2f  按照浮点数打印,至少6个字符宽,小数点后有2位小数

%x     按照十六进制打印

%c     打印字符

%s     打印字符串            

例如:使用printf函数输出一个整型数据1234,则调用格式如下:

int data=1234;

printf(“输出整型数据data=%d\r\n”,data);

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "usart.h"int main()
{u8 i;u16 data=1234;float fdata=12.3456;char str[]="Hello World!";SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组LED_Init();USART1_Init(9600);while(1){i++;if(i%20 ==0){led1=!led1;//LED1闪,用来指示主程序循环是否运行printf("输出整型数data=%d\r\n",data);printf("输出浮点数fdata=%.2f\r\n",fdata);printf("输出十六进数data=%X\r\n",data);printf("输出八进数data=%o\r\n",data);printf("输出子符串str=%s\r\n",str);}delay_ms(10);}
}
#include "usart.h"int fputc(int ch,FILE *p)  //在使用printf函数时自动调用此函数
{USART_SendData(USART1,(u8)ch);	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);return ch;
}void USART1_Init(u32 BoudRate)
{GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //PA9为USART1的TXDGPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //PA10为USART1的RXDGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitStructure.USART_BaudRate = BoudRate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1, ENABLE);  //使能串口1USART_ClearFlag(USART1, USART_FLAG_TC);//清除串口1发送中断标志位USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启RXNE(接收中断)//设置中断优先级,使能中断通道NVIC_InitStructure.NVIC_IRQChannel=	USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =3;NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}void USART1_IRQHandler(void)
{u8 r;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){r=USART_ReceiveData(USART1);//开发板接收从电脑发过来的数据USART_SendData(USART1, r);//开发板再把收到的数据发送回电脑while(USART_GetFlagStatus(USART1, USART_FLAG_TC)!=SET);//等待,直到发送完成USART_ClearFlag(USART1, USART_FLAG_TC);//清除串口1发送中断标志位}}

实验是成功的,在开发板上运行后结果如下:

                    

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

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

相关文章

linux 任务管理(临时任务定时任务) 实验

目录 任务管理临时任务管理周期任务管理 任务管理 临时任务管理 执行如下命令添加单次任务&#xff0c;输入完成后按组合键Ctrl-D。 [rootopenEuler ~]# at now5min warning: commands will be executed using /bin/sh at> echo "aaa" >> /tmp/at.log at&g…

什么是 PL/SQL

PL/SQL 是 Oracle 公司开发的一种过程化扩展 SQL 语言&#xff0c;它结合了 SQL 语句和过程化编程的特点&#xff0c;允许开发者在一个块&#xff08;block&#xff09;中编写声明、条件语句、循环等&#xff0c;使得数据库编程更加灵活和强大。PL/SQL 常用于 Oracle 数据库系统…

bash脚本 报错:/bin/bash^M:解释器错误: 没有那个文件或目录

bash脚本 报错&#xff1a;/bin/bash^M&#xff1a;解释器错误: 没有那个文件或目录 出现这个问题是因为该脚本文件在windows下编辑过 在windows下&#xff0c;每一行的结尾是\n\r&#xff0c;而在linux下文件的结尾是\n&#xff0c;那么你在windows下编辑过的文件在linux下打…

J-STAGE (日本电子科学与技术信息集成)数据库介绍及文献下载

J-STAGE (日本电子科学与技术信息集成)是日本学术出版物的平台。它由日本科学技术振兴机构&#xff08;JST&#xff09;开发和管理。该系统不仅包括期刊&#xff0c;还有论文集&#xff0c;研究报告、技术报告等。文献多为英文&#xff0c;少数为日文。目前网站上所发布的内容来…

零基础学Java第十三天之日期类

日期时间类 1、Date 1、理解 表示特定的瞬间&#xff1a;Date对象表示从"epoch"&#xff08;即1970年1月1日 00:00:00 GMT&#xff09;开始计算的毫秒偏移量。不包含时区信息&#xff1a;原始的Date类不直接处理时区。它只是一个时间点&#xff0c;没有与时区关联。…

使用Vue调用ColaAI Plus大模型,实现聊天(简陋版)

首先去百度文心注册申请自己的api 官网地址&#xff1a;LuckyCola 注册点开个人中心 查看这个文档自己申请一个ColaAI Plus定制增强大模型API | LuckyColahttps://luckycola.com.cn/public/docs/shares/api/colaAi.html来到vue的页面 写个样式 <template><Header …

ICode国际青少年编程竞赛- Python-5级训练场-综合练习6

ICode国际青少年编程竞赛- Python-5级训练场-综合练习6 1、 for i in range(3):Dev.step(2 * (i 1))Dev.turnLeft()while Flyer[2 - i].disappear():wait()Dev.step(2 * (i 1))Dev.turnRight()while Dev.x ! Item[i].x:wait()2、 for i in range(3):Dev.step(2 * i 1)while …

用Python的pynput库成为按键记录高手

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 揭秘键盘输入&#xff1a;pynput库的基本介绍 无论是为了安全审计、数据分析还是创建热键操作&#xff0c;能够记录和处理键盘事件都显得尤为关键。这就是pynput库发挥作用的地方。pynput是一个Python库&#xff0c…

Java 对象序列化

序列化&#xff1a;把对象转化为可传输的字节序列过程称为序列化。 反序列化&#xff1a;把字节序列还原为对象的过程称为反序列化 序列化的作用是方便存储和传输&#xff0c;细节可参考如下文章&#xff1a; 序列化理解起来很简单 - 知乎序列化的定义 序列化&#xff1a;把对…

echarts map地图添加背景图

给map地图添加了一个阴影3d的效果&#xff0c;添加一张背景图&#xff0c;给人感觉有3d的效果 具体配置如下&#xff1a; html代码模块&#xff1a; <div class"echart_img" style"position: fixed; visibility: hidden;"></div><div id&q…

Autoware内容学习与初步探索(一)

0. 简介 之前作者主要是基于ROS2&#xff0c;CyberRT还有AutoSar等中间件完成搭建的。有一说一&#xff0c;这种从头开发当然有从头开发的好处&#xff0c;但是如果说绝大多数的公司还是基于现成的Apollo以及Autoware来完成的。这些现成的框架中也有很多非常好的方法。目前作者…

【Java的抽象类和接口】

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 以上代码中…

Leaflet系列——【一】初识Leaflet与Leaflet视图操作

初识Leaflet&#xff08;vue3 &#xff09; 前言&#xff1a;当你熟悉了openlayer、mapbox、cesium等一些GIS框架之后&#xff0c;对于我们开发来说其实他们的本质就是往瓦片上面叠加图层、【点、线、面、瓦片、geoJson、热力图、图片、svg等等】都是一层层的Layer图层&#xf…

MySQL中的多表设计

由于业务之间的相互关联&#xff0c;所以各个表结构之间也存在着各种联系 基本分为三种&#xff1a; 一对多 多对多 一对一 外键语法 create table 表名&#xff08; 字段名 数据类型&#xff0c; ... [constraint] 外键名称 foreign key &#xff08;外键字段名&#…

银川项目外包找邦芒 助力企业减压增效

银川邦芒人力项目外包&#xff0c;是指企业将原本由自身承担的具有基础性、共性、非核心的IT业务和基于IT的业务流程&#xff0c;委托给专业的外部服务提供商来执行的一种经济活动。这种全方位的企业用工解决方案&#xff0c;旨在帮助企业优化资源配置、降低成本、提升效率&…

相同的随机种子CPU和GPU上torch.nn.init.xavier_normal_结果并不一致

相同的随机种子CPU和GPU上torch.nn.init.xavier_normal_结果并不一致 一.测试代码二.输出 在训练pytorch模型时,相同的随机种子,不同的服务器上loss并不一样,通过调试发现这二个平台的权值也不一样.单独测试torch.nn.init.xavier_normal_,发现也不一样.如果都放在CPU上则二台服…

Ceph集群扩容及数据再均衡原理分析

用户文件在Ceph RADOS中存储、定位过程大概包括&#xff1a;用户文件切割成对象、对象映射到PG、PG分组PGP、PG映射到OSD。这些过程中&#xff0c;可能涉及了大量概念和变量&#xff0c;而其实它们大部分是通过HASH、CRUSH等算法计算出来的&#xff0c;初始参数可能也就只有这么…

sql实践

1.从excel导入数据 在excel导入数据时要先在数据库中创建对应的数据库表 CREATE TABLE your_table_name (crawl_datetime DATE,url CHAR(255),company_name CHAR(255),company_size CHAR(255),company_type CHAR(255),job_type CHAR(255),job_name CHAR(255),edu CHAR(255),e…

暗区突围TWITCH掉宝关联帐号不了 无法关联帐号 关联不上

Twitch&#xff0c;作为全球知名的游戏直播平台&#xff0c;常常携手热门游戏如《暗区突围》举办互动活动&#xff0c;为玩家带来独特的参与体验。在这个过程中&#xff0c;“绑定关联”成为了连接直播观众与游戏世界的桥梁。简单来说&#xff0c;Twitch绑定关联《暗区突围》指…

leetcode——链表的中间节点

876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 链表的中间节点是一个简单的链表OJ。我们要返回中间节点有两种情况&#xff1a;节点数为奇数和节点数是偶数。如果是奇数则直接返回中间节点&#xff0c;如果是偶数则返回第二个中间节点。 这道题的解题思路是&a…