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

news2024/11/16 17:27:20

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的TXD
	GPIO_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的RXD
	GPIO_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);  //使能串口1
	USART_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.coloradmin.cn/o/1676553.html

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

相关文章

java—数据库批量插入数据

前言 本篇文章将记录几种使用java向mysql数据库中批量插入数据的方法&#xff0c;比如插入1000条&#xff0c;10000条&#xff0c;10万条甚至100万条数据。操作数据库的方式采用Mybatis框架。 输入的数据&#xff1a; 现数据库有一个student表&#xff0c;表中字段如下&…

手撸XXL-JOB(二)——定时任务管理

在上一节中&#xff0c;我们介绍了SpringBoot中关于定时任务的执行方式&#xff0c;以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台&#xff0c;那么&#xff0c;对于任务的管理&#xff0c;是尤为重要的。接下来我们…

讲解SSM的xml文件

概述&#xff1a;这些配置文件很烦&#xff0c;建议直接复制粘贴 springMVC.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XM…

k8s endpoint

Endpoint Service 并不是和 pod 直接相连的&#xff0c;Endpoint 介于两者之间。Endpoint 资源就是暴露一个服务的 IP 地址和端口的列表。 虽然在 spec 服务中定义了 pod 选择器&#xff0c;但在重定向传入连接时不会直接使用它。选择器用于构建 IP 和端口列表&#xff0c;然…

SQOOP详细讲解

SQOOP安装及使用 SQOOP安装及使用SQOOP安装1、上传并解压2、修改文件夹名字3、修改配置文件4、修改环境变量5、添加MySQL连接驱动6、测试准备MySQL数据登录MySQL数据库创建student数据库切换数据库并导入数据另外一种导入数据的方式使用Navicat运行SQL文件导出MySQL数据库impo…

企业必看:镭速教你如何测试内网文件传输效率和稳定问题

在现代商业运作中&#xff0c;企业内部文件传输的效率和稳定性对于数据管理和业务流程极为重要。无论是远程工作还是团队协作&#xff0c;高效的文件传输都能显著提升工作效率。今天镭速小编就教你如何测试内网文件传输效率和稳定问题。 1、磁盘性能&#xff0c;即硬盘的读取和…

JVM从1%到99%【精选】-运行时数据区

目录 1.总览运行时数据区 2.内存溢出 3. 程序计数器 4.虚拟机栈 5.本地方法栈 6.堆 7.方法区 8.直接内存 1.总览运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。运行时数据区可以分为方法区、堆、虚拟机栈、本地方法栈、程序计数器…

分享一些关于软件测试的面试问题

由于最近在面试软件测试工程师的岗位&#xff0c;遇到了一些面试的问题以及我的答案&#xff0c;希望对正在找工作的同行有些帮助&#xff0c;仅仅作为软件测试行业&#xff0c;求职者看问题就行&#xff0c;大佬可以探讨一下答案。 1.提交了bug&#xff0c;开发不认为是bug怎么…

JavaScript的综合案例

案例要求&#xff1a; 实现一个表单验证 1.当输入框失去焦点时&#xff0c;验证输入的内容是否符合要求 2.当点击注册按钮时&#xff0c;判断所有输入框的内容是否都符合要求&#xff0c;如果不符合要求阻止表单提交 简单的页面实现 <!DOCTYPE html> <html lang&…

凸优化理论学习三|凸优化问题(一)

系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题&#xff08;一&#xff09;标准形式的优化问题&#xff08;二&#xff09;可行点和最优点&#xff08;三&#xff09;局部最优点&#xff08;四…

【万字面试题】Redis

文章目录 常见面试题布隆过滤器原理和数据结构&#xff1a;特点和应用场景&#xff1a;缺点和注意事项&#xff1a;在python中使用布隆过滤器 三种数据删除策略LRU (Least Recently Used)工作原理&#xff1a;应用场景&#xff1a; LFU (Least Frequently Used)工作原理&#x…

振弦式应变计的灵敏系数k范围探讨

振弦式应变计是一种广泛应用于工程结构健康监测的重要设备&#xff0c;其灵敏系数k是衡量其性能的关键指标。本文将探讨振弦式应变计的灵敏系数k的一般范围&#xff0c;并分析影响灵敏系数的因素。 一、振弦式应变计的工作原理 振弦式应变计通过测量振弦在受力作用下的振动频率…

屡被约谈的货拉拉三闯IPO,CEO周胜馥IPO前套现11亿

近日&#xff0c;货运巨头货拉拉第三次闯关IPO。虽然其实现首次年度盈利&#xff0c;但光鲜数据背后的盈利模式却频遭诟病。 货拉拉的创始人周胜馥从美国高校毕业后&#xff0c;曾供职于贝恩咨询公司&#xff0c;并在期间对创业产生了浓厚兴趣。抛开履历中的高学历好工作的部分…

Amesim基础篇-表格类型设置与读取

前言 在Amesim仿真中,不可避免需要应用到表格。如新能源动力电池中内阻、充电倍率的调取,压缩机的机械效率、容积效率等,水泵的效率,管路的压降等等。本文将介绍如何对表格类型的选择与参数输入。 1 进入表格设置界面 如下图所示,在Amesim界面的右上角Table Editor进入…

EEL中 python端的函数名是如何传递给js端的

python端的函数名是如何传递给js端的 核心步骤&#xff1a;将函数名列表注入到动态生成的 eel.js 中&#xff0c;这样前端一开始引用的eel.js本身已经包含有py_function的函数名列表了。你打开开发者工具看看浏览器中的 eel.js文件源代码就知道了。 具体实现&#xff1a; # 读…

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint&#xff1f;2. 为什么要使用 Flask Blueprint&#xff1f;3. 如何使用 Flask Blueprint&#xff1f;4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时&#xff0c;保持代码的组织结构清晰…

etcd单机部署和集群部署

1、etcd单实例部署 对于平常的学习&#xff0c;其实搭建一个单机节点是够了的。接下来就讲讲怎么搭建单机节点。 本次部署是在 centos7 系统&#xff0c;cpu 为amd64 上面进行的。 部署是直接使用官方编译好的二进制文件&#xff0c;大家也可以直接看 ectd-releases 界面选择…

linux 环境下 分布式文件搭建fastDFS

1.软件信息 地址&#xff1a;happyfish100 (YuQing) GitHub 1.fastdfs-master.zip 2.fastdfs-nginx-module-master.zip 3.libfastcommon-master.zip 4.libserverframe-master.zip yum install make cmake gcc gcc-c perl 2.安装libfastcommon unzip libfastcommon-mast…

CPU利用率使用教程

本文主要参考&#xff1a; 一文让你学到 nmon最详尽的用法 Linux性能监控命令_nmon 安装与使用 如果你是在Ubuntu上安装nmon&#xff0c;使用&#xff1a; apt install nmon安装好后&#xff0c;直接运行 $:nmon #运行如果是后台抓数据&#xff1a; -f 参数: 生成文件,文件…

北京玻色量子携手赛氪网举办长三角高校数学建模竞赛巡回讲座

2024年5月13日下午&#xff0c;一场聚焦数学建模与量子计算前沿的讲座在中国计量大学隆重举行。此次讲座作为第四届长三角高校数学建模竞赛的巡回宣讲活动之一&#xff0c;由北京玻色量子科技有限公司与竞赛组委会成员赛氪网共同举办&#xff0c;旨在向广大师生介绍量子计算的应…