32USART串口

目录

一.通信接口

 二.时序

三.USART简介

​编辑四.数据帧

五.起始位侦测和采样位置对齐 &波特率计算

六.相关函数

七.编码格式设置

(1) UTF-8编码(有的软件兼容性不好)​编辑

(2)GB2312编码

 八.代码实现

1.串口发送数据

2.串口数据发送和接收 

(1)函数解决

(2)中断解决


一.通信接口

 二.时序

三.USART简介

 S:同步,它只支持时钟输出,不支持时钟输入,更多是为了兼容别的协议或者特殊用途而设计的

并不支持两个USART之间的同步通信

硬件流控制(防止接收数据的设备处理慢而导致数据丢失):有A发送设备和B接收设备,在硬件电路上多出一根线,如果B没准备好就置高电平,准备好就置低电平,A通过线路接收到B反馈的准备信号,就只会在B准备好时发送数据

LIN:局域网的通信协议

USART1时APB2总线上的设备,USART2,USART3为APB1总线上的设备

USART框图

四.数据帧

五.起始位侦测和采样位置对齐 &波特率计算

六.相关函数

 

七.编码格式设置

(1) UTF-8编码(有的软件兼容性不好)

写入参数--no-multubyte-chars 

(2)GB2312编码

不用写入参数--no-multubyte-chars 

 八.代码实现

1.串口发送数据

Serial.c 

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>
void Serial_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate=9600;//自动计算写入BRR寄存器
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//流控配置
	USART_InitStructure.USART_Mode=USART_Mode_Tx;//发送模式
	USART_InitStructure.USART_Parity=USART_Parity_No;//校验位
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART1,&USART_InitStructure);
	
	USART_Cmd(USART1,ENABLE);
	
}
void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1,Byte);//将数据写入DR
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
void Serial_SendArray(uint8_t *Array,uint16_t Size)
{
	uint8_t i;
	for(i=0;i<Size;i++)
	{
		
		Serial_SendByte(Array[i]);
	}
}
void Serial_SendString(char *My_String)
{
	uint8_t i;
	for(i=0;My_String[i] != '\0';i++)
	{
		Serial_SendByte(My_String[i]);
	}
	
}
uint32_t Serial_Pow(uint8_t Number,uint8_t Num)//次方,返回值定义要足够大
{
	uint32_t result=1;
	while(Num--)
	{
		result *= Number;
	}
	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)+'0');//加字符消除偏移
		
	}
}
int fputc(int ch,FILE *f)//fputc是printf的底层
{
	Serial_SendByte(ch);//将fputc函数重定向到串口
	return ch;
}

	/*
		封装可变参数的格式
	
	*/
void Serial_Printf(char *format,...)
{
	char String[100];
	va_list arg;
	va_start(arg,format);
	vsprintf(String,format,arg);//对于封装格式,要用vsprintf
	va_end(arg);//释放参数列表
	Serial_SendString(String);
	
	
}

 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Serial.h" 
int main(void)
{
	char String[100];//局部变量都要定义在开头
	uint8_t arr1[]={0x41,0x42,0x43,0x44,0x45};
	OLED_Init();
	Serial_Init();
	Serial_SendByte(0x41);
	Serial_SendArray(arr1,5);
	Serial_SendString("Akebi\r\n");//换行是“\r\n”
	Serial_SendNumber(12345,5);
	/*printf移植*/
	printf("Num=%d\r\n",666);//1.在Serial.c中将fputc函数重定向到串口
	 
	/*	
		sprintf可以指定打印位置,不涉及重定向
		这样可以确保每个串口都可以使用sprintf
	*/
	sprintf(String,"Num=%d\r\n",666);//可以将格式化字符输出到一个字符串里
	Serial_SendString(String);
	
	/*
		封装可变参数的格式
	
	*/
	Serial_Printf("Num=%d\r\n");
	
	
	Serial_Printf("你好,世界");
	
	
	
	while(1)
	{
		
		
	}	
}

2.串口数据发送和接收 

(1)函数解决

(2)中断解决

Serial.c 

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>
uint8_t ReData,ReFlag;
void Serial_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate=9600;//自动计算写入BRR寄存器
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//流控配置
	USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;//发送和接收模式
	USART_InitStructure.USART_Parity=USART_Parity_No;//校验位
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART1,&USART_InitStructure);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1,ENABLE);
	
}
void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART1,Byte);//将数据写入DR
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
void Serial_SendArray(uint8_t *Array,uint16_t Size)
{
	uint8_t i;
	for(i=0;i<Size;i++)
	{
		
		Serial_SendByte(Array[i]);
	}
}
void Serial_SendString(char *My_String)
{
	uint8_t i;
	for(i=0;My_String[i] != '\0';i++)
	{
		Serial_SendByte(My_String[i]);
	}
	
}
uint32_t Serial_Pow(uint8_t Number,uint8_t Num)//次方,返回值定义要足够大
{
	uint32_t result=1;
	while(Num--)
	{
		result *= Number;
	}
	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)+'0');//加字符消除偏移
		
	}
}
int fputc(int ch,FILE *f)//fputc是printf的底层
{
	Serial_SendByte(ch);//将fputc函数重定向到串口
	return ch;
}

/*
		封装可变参数的格式
	
*/
void Serial_Printf(char *format,...)
{
	char String[100];
	va_list arg;
	va_start(arg,format);
	vsprintf(String,format,arg);//对于封装格式,要用vsprintf
	va_end(arg);//释放参数列表
	Serial_SendString(String);
}
uint32_t Get_Flag(void)
{
	if(ReFlag == 1)
	{
		ReFlag=0;
		return 1;
	}
	return 0;
	
}
uint32_t Get_Byte(void)
{
	
	return ReData;//这里应直接返回Data,不要进行Serial_RxFlag的判断,不然程序执行会跳过
	
	
}
void USART1_IRQHandler(void)
{
	if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET)
	{
		ReData = USART_ReceiveData(USART1);
		ReFlag = 1;//其实这几行就是将数据进行一次转存,尽量单一化中断函数的内部功能
		USART_ClearFlag(USART1,USART_FLAG_RXNE);
	}
}

main.c 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "OLED.h" 
#include "Serial.h" 
uint16_t Data;
int main(void)
{
	OLED_Init();
	Serial_Init();
	OLED_ShowString(1,1,"RxData:");
	while(1)
	{
		if(Get_Flag() == 1)
		{
			Data = Get_Byte();
			Serial_SendByte(Data);//接收数据回传
			OLED_ShowHexNum(1,8,Data,2);
		}	
	}	
}
		
		

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

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

相关文章

MySQL之建表操作

华子目录 表操作创建表数据类型文本类型数值类型日期/时间类型Bit数据类型常见数据类型 MySQL存储引擎创建表的三个操作创建表时指定存储引擎&#xff0c;字符集&#xff0c;校对规则&#xff0c;行格式 查看表显示数据库中所有表显示数据库中表的信息&#xff08;表结构&#…

Java实现教学过程管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2.3.1 教师功能如下2.3.2 学生功能如下 三、系统展示 四、核心代码4.1 查询签到4.2 签到4.3 查询任务4.4 查询课程4.5 生成课程成绩 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVu…

2023:AI疯狂进化年

嘿&#xff0c;大家好&#xff01;让我们一起来回顾一下这疯狂的 2023 年吧&#xff01;记得那个二月初吗&#xff1f;ChatGPT 上线了&#xff0c;然后呢&#xff1f;短短两个月&#xff0c;用户数量就像火箭一样突破了 1 亿&#xff01;这速度&#xff0c;简直比超级赛亚人还快…

设置打印机

一、打开控制面板的设备和打印机选项 二、点击其中的添加打印机选项 三、点我所需的打印机未列出 四、使用IP地址或主机名添加打印机 五、输入IP

python将Word页面纸张方向设置为横向

通过python-docx的章节属性&#xff0c;就可以更改纸张方向、纸张尺寸。 import docx from docx.enum.section import WD_ORIENT from docx.shared import Cmdocument docx.Document() section document.sections[0]# 设置纸张大小为A4大小 section.page_width Cm(21) sect…

稳压二极管应用电路

稳压二极管比较特殊&#xff0c;基本结构与普通二极管一样&#xff0c;也有一个PN结。由于制造工艺的不同&#xff0c;当这种PN结处于反向击穿状态时&#xff0c;PN结不会损坏(普通二极管的PN结是会损坏)&#xff0c;在稳压二极管用来稳定电压时就是利用它的这一击穿特性。 由…

泰克示波器(TBS2000系列)数学运算功能使用

目录 1 数学运算菜单1.1 运算符选择1.2 信源选择1.3 数学运算结果 1 数学运算菜单 Math运算按钮&#xff0c;用于实现对两个通道的信号进行实时的“加、减、乘”运算&#xff0c;计算时信源1在前面&#xff0c;信源2在运算符的右边&#xff0c;设置时设置信源与运算符就行了。…

请查收,你的2023京东零售技术年度好文

新春佳节&#xff0c;万象更新&#xff01;京东零售技术在2023年度发布文章内容145篇&#xff0c;全年阅读量超过20万次&#xff5e;衷心感谢每一位读者一直以来的关注和支持。 在新春到来之际&#xff0c;我们精选年度好文分享给大家&#xff0c;希望大家温故知新&#xff0c…

HarmonyOS 鸿蒙应用开发(十、第三方开源js库移植适配指南)

在前端和nodejs的世界里&#xff0c;有很多开源的js库&#xff0c;通过npm(NodeJS包管理和分发工具)可以安装使用众多的开源软件包。但是由于OpenHarmony开发框架中的API不完全兼容V8运行时的Build-In API&#xff0c;因此三方js库大都需要适配下才能用。 移植前准备 建议在适…

bert+np.memap+faiss文本相似度匹配 topN

目录 任务 代码 结果说明 任务 使用 bert-base-chinese 预训练模型将文本数据向量化后&#xff0c;使用 np.memap 进行保存&#xff0c;再使用 faiss 进行相似度匹配出每个文本与它最相似的 topN 此篇文章使用了地址数据&#xff0c;目的是为了跑通这个流程&#xff0c;数…

DoWhy:Python 中的因果推断库

DoWhy&#xff1a;Python 中的因果推断库 DoWhy 是一个强大的 Python 库&#xff0c;用于因果推断和因果推断分析。本文将介绍 DoWhy 的基本概念、主要功能和使用方法&#xff0c;帮助读者了解如何利用该库进行因果推断&#xff0c;并解决因果关系的相关问题。 什么是DoWhy&…

AI-数学-高中-24-三角函数一般形式的各参数含义

原作者视频&#xff1a;三角函数】12三角函数一般形式的各参数含义&#xff08;易&#xff09;_哔哩哔哩_bilibili 1.函数中的A标识符&#xff1a;表示曲线中间平衡位置的振幅&#xff0c;值域为正负A&#xff1a;[-A,A]。 2.函数中的B标识符&#xff1a;决定曲线纵向上下平移…

python实现中国剩余定理

中国剩余定理又称孙子定理&#xff0c;是数论中一个重要定理。最早可见于我国的数学著作《孙子算经》卷下“物不知数”问题&#xff0c;原文如下&#xff1a; 有物不知其数&#xff0c;三三数之剩二&#xff0c;五五数之剩三&#xff0c;七七数之剩二。问物几何&#xff1f;即…

一步步建立一个C#项目(连续读取S7-1200PLC数据)

这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。 1、窗体应用 2、配置存储位置 3、选择框架 拖拽一个Button,可以选择视图菜单---工具箱 4、工具箱 拖拽Lable控件和TextBook控件 5、拖拽控件 接下来…

Linux文件和目录管理

目录基础 Linux操作系统以目录的方式来组织和管理系统中的所有文件。所谓的目录&#xff0c;就是将所有文件的说明信息采用树状结构组织起来。每个目录节点之下会有文件和子目录。 所有一切都从 ‘根’ 开始&#xff0c;用 ‘/’ 代表, 并且延伸到子目录。 bin&#xff1a;B…

《MySQL 简易速速上手小册》第2章:数据库设计最佳实践(2024 最新版)

文章目录 2.1 规划高效的数据库架构2.1.1 基础知识2.1.2 重点案例2.1.3 拓展案例 2.2 数据类型和表设计2.2.1 基础知识2.2.2 重点案例2.2.3 拓展案例 2.3 索引设计原则2.3.1 基础知识2.3.2 重点案例2.3.3 拓展案例 2.1 规划高效的数据库架构 在开启我们的数据库设计之旅之前&a…

240207-3步设置VSCode插件Inline-Bookmarks自定义颜色及名称

Step 1: 插件安装 Step 2: 配置文件 "inline-bookmarks.expert.custom.styles": {"default": {"gutterIconColor": "#157EFB","overviewRulerColor": "rgba(21, 126, 251, 0.7)","light": {"fontW…

【C++从0到王者】第四十二站:类型转换

文章目录 一、 C语言中的类型转换1. C语言中的类型转换2.一个常见的坑 二、为什么C需要四种类型转换三、C强制类型转换1.static_cast2.reinterpret_cast3.const_cast4.dynamic_cast 四、RTTI 一、 C语言中的类型转换 1. C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符…

MOS管防反接电路设计

电子元件大都是使用直流工作&#xff0c;电源线反接就有可能就会烧坏&#xff0c;那电路如何防反接&#xff1f;首当其冲我们想到的就是二极管了&#xff0c;运用其单向导通特性可有效防止电源反接而损坏电路&#xff0c;但是随之而来的问题是二极管存在PN节电压&#xff0c;通…

【C++航海王:追寻罗杰的编程之路】类与对象你学会了吗?(下)

目录 1 -> 再谈构造函数1.1 -> 构造函数体赋值1.2 -> 初始化列表1.3 -> explicit关键字 2 -> static成员2.1 -> 概念2.2 -> 特性 3 -> 友元3.1 -> 友元函数3.2 -> 友元类 4 -> 内部类5 -> 匿名对象6 -> 拷贝对象时的一些编译器优化 1 -…