11_printf函数移植串口通信

printf函数移植串口通信

  • printf函数移植串口通信
  • 串口显示汉字乱码问题解决
  • 代码

printf函数移植串口通信

在这里插入图片描述
MicroLIB是Keil为嵌入式平台优化的一个精简库
在这里插入图片描述
--no-multibyte-chars

串口显示汉字乱码问题解决

法一
在这里插入图片描述

在这里插入图片描述
法二
在这里插入图片描述

代码

主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "stdint.h"
#include "OLED.h"
#include "Serial.h"




int main(void)
{
	OLED_Init();
	
	Serial_Init();
//	Serial_SendByte(0x41);
//	
//	uint8_t MyArray[]={0x42,0x43,0x44,0x45};
//	Serial_SendArray(MyArray,4);
//	
//	Serial_SendString("Hello");
	
//	Serial_SendNumber(12345,5);
	
	
//	//法一
//	printf("Num=%d\r\n",666);
//	//法二
//	char String[100];
//	sprintf(String,"Num=%d\r\n",666);//指定打印字符串位置
//	Serial_SendString(String);
	//法三,封装sprintf
	Serial_Sprintf("Num=%d\r\n",666);
	
	while(1)
	{
		
	}
}

串口.c Serial.c

#include "stm32f10x.h"                  // Device header
#include "stdint.h"
#include "stdio.h"
#include "stdarg.h"

void Serial_Init(void)
{
	//第一步:开启USART和GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//第二步:GPIO初始化,把TX配置成复用输出,RX配置成输入
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//TX引脚是USART外设控制的输出脚,所以要选复用推挽输出,RX引脚是外设输入引脚,所以要选择输入模式,
	//可以有多个输入,只能用一个输出,一般RX配置为浮空输入或者上拉输入,因为串口波形默认空闲状态是高电平,所以不使用下拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//第三步:配置USART,直接使用一个结构体
	USART_InitTypeDef USART_InitSturcture;
	USART_InitSturcture.USART_BaudRate=9600;//波特率
	USART_InitSturcture.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
	USART_InitSturcture.USART_Mode=USART_Mode_Tx;//发送模式,如果发送接收都要,就是|起来
	USART_InitSturcture.USART_Parity=USART_Parity_No;//校验位 odd奇校验 even偶校验 no无校验
	USART_InitSturcture.USART_StopBits=USART_StopBits_1;//停止位
	USART_InitSturcture.USART_WordLength=USART_WordLength_8b;//字长  9位是带了一位校验位
	USART_Init(USART1,&USART_InitSturcture);
	//第四步:开启USART,如果需要接收功能,可能还需要配置中断
	USART_Cmd(USART1,ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1,Byte);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//标志位置1之后,不需要手动清零,当下一次再SendData时,这个标志位会自动清零
}

void Serial_SendArray(uint8_t *Array,uint16_t Length)
{
	uint16_t i;
	for(i=0;i<Length;i++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for(i=0;String[i]!='\0';i++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X,uint32_t Y)  // X的Y次方
{
	uint32_t Result = 1;
	while(Y--)
	{
		Result *=X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number,uint8_t Length)
{
	uint8_t i;
	for(i=0;i<Length;i++)
	{
		Serial_SendByte(Number / Serial_Pow(10,Length-i-1)%10+0x30);//如果是2位数,2-0-1,10的1次方,发十位,再2-1-1,10的0次方,发个位   
	                         //0x30为ASCII表字符偏移,字符0为0x30 ,也可以写 '0'                    
	}
}

//重写fputc函数,重定向到串口,fputc函数是printf函数的底层	
int fputc(int ch,FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

//封装sprintf
void Serial_Sprintf(char *format,...)
{
	char String[100];
	va_list arg;
	va_start(arg,format);
	vsprintf(String,format,arg);
	va_end(arg);
	Serial_SendString(String);
}


串口.h Serial.h

#ifndef __SERIAL_H
#define __SERIAL_H
#include "stdint.h"
#include "stdio.h"
void Serial_SendByte(uint8_t Byte);
void Serial_Init(void);
void Serial_SendArray(uint8_t *Array,uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number,uint8_t Length);
int fputc(int ch,FILE *f);
void Serial_Sprintf(char *format,...);
#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[StartingPoint][Tier1]Sequel

Task 1 During our scan, which port do we find serving MySQL? (在扫描过程中&#xff0c;我们发现哪个端口为 MySQL 提供服务&#xff1f;) 3306 Task 2 What community-developed MySQL version is the target running? (目标正在运行哪个社区开发的 MySQL 版本&…

详解 Redis 在 Centos 系统上的安装

详解 Redis 在 Centos 系统上的安装 1. 使用 yum 安装 Redis 5 如果是Centos8&#xff0c;yum 仓库中默认的 redis 版本就是5&#xff0c;直接 yum install 即可 如果是Centos7, yum 仓库中默认的 redis 版本是3系列&#xff0c;版本就比较老 使用yum list | grep redis命令…

【问题解决】电脑突然 总蓝屏,这份火爆全网的452页Linux运维 Framework内核解析

“你的设备遇到问题&#xff0c;需要重启。我们智手机某些错误信息&#xff0c;然后为你重新启动。” 电脑突然就蓝屏了&#xff0c;终止代码显示&#xff1a;UNEXPECTED_STORE_EXCEPTION。 原因分析&解决方案 可能性原因解决方案1出现蓝屏的情况&#xff0c;大部分原因都…

【C++ STL容器适配器】queue 队列

文章目录 【 1. 基本原理 】【 1. queue 的创建 】2.1 使用默认的 deque 基础容器创建一个空的 queue2.2 指定基础容器创建 queue2.3 通过基础容器来初始化 queue 容器适配器2.4 通过一个 queue 初始化另一个 queue 【 3. queue 支持的成员函数 】 【 1. 基本原理 】 STL queu…

ChatGPT(3.5版本)开放无需注册:算力背后的数据之战悄然打响

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

AI Agents产品图谱+网站合集

这个网站收集了市面受欢迎的项目&#xff0c;包括开源项目和闭源项目以及公司 地址&#xff1a;通过浏览列表中的AI代理项目和公司&#xff0c;社区里的创业者可以了解当前市场上的主要玩家和他们的产品特点&#xff0c;进行市场趋势分析和竞争分析。

2024妈妈杯数学建模思路ABCD题思路汇总分析 MathorCup建模思路分享

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

看书学习各类编程效率高吗?

最近给大家争取到一个 深夜福利 保证你在深夜手机刷到 嘎嘎香~ 那就是 官方授权 大流量卡 缺点&#xff1a;月租太便宜 185GB~ 100分钟通话时长~ 长期套餐~ 畅想自由的气息 流量自由的同时还拥有超长通话&#xff0c;而且免费领取。 名额有限&#xff0c;咱们废话不…

青蛙跳杯子【蓝桥杯】/bfs

青蛙跳杯子 bfs 思路&#xff1a;刚开始用的是dfs&#xff0c;但是不太行&#xff0c;DFS 可能会导致搜索深度过深&#xff0c;增加了时间复杂度&#xff0c;BFS 适合求解最短路径问题&#xff0c;BFS 在搜索过程中&#xff0c;首先访问距离初始节点最近的节点&#xff0c;因此…

欧拉函数确定1-n有多少个数和 n 互质详解 附C语言代码 蓝桥杯互质数的个数

唯一分解定理 任意一个大于 1 的正整数都能被唯一地分解为质因数的乘积。 例如 8 2*2*2&#xff0c; 171 3*3*19&#xff0c; 30 2*3*5&#xff0c; 19 19。注意1既不是质数也不是合数。 为什么判断一个数是否是质数只要判断2-√n中有没有因数 24可以分解成 4*6&#x…

时序预测 | Python实现BiGRU-RELM时间序列预测

时序预测 | Python实现BiGRU-RELM时间序列预测 目录 时序预测 | Python实现BiGRU-RELM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BiGRU-RELM时间序列预测分析 将BiGRU和RELM两种模型进行了融合&#xff0c;BiGRU进行预测&#xff0c;RELM对BiGRU模型的预…

算法刷题Day24 | 216.组合总和III、17.电话号码的字母组合

目录 0 引言1 组合总和 III1.1 我的解题 2 电话号码的字母组合2.1 我的解题2.2 优秀的题解 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;算法刷题Day24 | 216.组合总和III、17.电话号码的字母组合❣️ 寄…

Linux基础篇:Linux第三方软件仓库——可以让Linux变得有趣的软件仓库

Linux第三方软件仓库——可以让Linux变得有趣的软件仓库 一、epel源介绍 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;源是一个由Fedora项目组维护的第三方软件仓库&#xff0c;为企业级Linux发行版&#xff08;如Red Hat Enterprise Linux&#xff08;…

opencv+python(通道的分离与合并)笔记

分割图像通道&#xff1a; 通过函数mvsplit(img)&#xff1b;mv返回的通道&#xff1b; RGB有3个通道&#xff1b;灰度图只有一个通道&#xff1b; b,g,r cv2.split(img)cv2.imshow("b",b)#通道bcv2.imshow("g",g)#通道gcv2.imshow("r",r)#通道…

Flutter 应用数据持久化指南

1. 介绍 1.1 什么是数据持久化&#xff1f; 数据持久化是指将应用程序中的数据保存在持久存储介质&#xff08;如硬盘、数据库等&#xff09;中的过程。在计算机科学领域&#xff0c;持久化数据是指数据在程序退出或系统关机后仍然存在的能力。这种持久性使得数据可以在不同的…

为什么说“微隔离技术“ 那么重要,德迅零域给您答案

随着网络安全威胁不断增加&#xff0c;传统安全措施难以承受这种压力&#xff0c;人们需要更强大的防护工具来确保个人和组织的数据不会被攻击者窃取。 “微隔离”技术是一种在设备内部进行隔离的安全机制。它基于各种硬件或软件实现不同隔离策略&#xff0c;将不同的数据或应用…

C++——STL容器——string

目录 1.构造函数 模拟实现 2.析构函数 模拟实现 3.string遍历 3.1 c_str、size、lenth、capacity等 模拟实现 3.2 字符串元素访问 3.2.1 []操作符重载、at 模拟实现 3.2.2 front、back等 3.3 迭代器 模拟实现 4.赋值操作 4.1 赋值重载函数 模拟实现 4.2 assig…

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design+百小僧开源框架

C#手术麻醉信息系统源码&#xff0c;技术框架&#xff1a;Vue&#xff0c;Ant-Design百小僧开源框架 手术麻醉系统主要用于在手术过程中监测和控制患者的状态&#xff0c;确保手术的顺利进行并保障患者的生命安全。该系统通过一系列先进的医疗设备和技术&#xff0c;为手术患者…

【tensorflow框架神经网络实现鸢尾花分类—优化器】

文章目录 1、前言2、神经网络参数优化器2.1、SGD2.2、SGDM2.3、Adagrad2.4、RMSProp2.5、Adam 3、实验对比不同优化器4、结果对比 1、前言 此前&#xff0c;在【tensorflow框架神经网络实现鸢尾花分类】一文中使用梯度下降算法SGD&#xff0c;对权重 w w w和偏置 b b b进行更新…

多态.Java

&#xff08;1&#xff09;什么是多态&#xff1f; 同类型的对象&#xff0c;表现出不同的形态。前者指父类&#xff0c;后者指不同的子类 说简单点&#xff0c;就是父类的同一种方法&#xff0c;可以在不同子类中表现出不同的状态&#xff0c;或者说在不同子类中可以实现不同…