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);//将数据写入DRwhile(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);//对于封装格式,要用vsprintfva_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);//将数据写入DRwhile(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);//对于封装格式,要用vsprintfva_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.hqwc.cn/news/459408.html

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

相关文章

解密 ARMS 持续剖析:如何用一个全新视角洞察应用的性能瓶颈?

作者&#xff1a;饶子昊、杨龙 应用复杂度提升&#xff0c;根因定位困难重重 随着软件技术发展迭代&#xff0c;很多企业软件系统也逐步从单体应用向云原生微服务架构演进&#xff0c;一方面让应用实现高并发、易扩展、开发敏捷度高等效果&#xff0c;但另外一方面也让软件应…

JAVA SpringBoot中使用redis的事务

目录 一、Java语言介绍 二、SpringBoot框架介绍 三、Redis缓存介绍 四、什么是redis的事务 一、Java语言介绍 Java是一种广泛使用的高级编程语言,由Sun Microsystems公司于1995年推出。它的设计目标是要求“一次编写,到处运行”&#xff08;Write Once, Run Anywhere, WOR…

微软.NET6开发的C#特性——类、结构体和联合体

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性。 C#经历了多年发展&#xff0c; 进行了多次重大创新&#xf…

机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧

文章目录 1.K-近邻算法思想2.K-近邻算法(KNN)概念3.电影类型分析4.KNN算法流程总结5.k近邻算法api初步使用机器学习库scikit-learn1 Scikit-learn工具介绍2.安装3.Scikit-learn包含的内容4.K-近邻算法API5.案例5.1 步骤分析5.2 代码过程 1.K-近邻算法思想 假如你有一天来到北京…

【开源】JAVA+Vue+SpringBoot实现房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

2 月 7 日算法练习- 数据结构-树状数组

树状数组 lowbit 在学习树状数组之前&#xff0c;我们需要了解lowbit操作&#xff0c;这是一种位运算操作&#xff0c;用于计算出数字的二进制表达中的最低位的1以及后面所有的0。 写法很简单&#xff1a; int lowbit&#xff08;int x&#xff09;&#xff5b;return x &am…

Android Compose 一个音视频APP——Magic Music Player

Magic Music APP Magic Music APP Magic Music APP概述效果预览-视频资源功能预览Library歌曲播放效果预览歌曲播放依赖注入设置播放源播放进度上一首&下一首UI响应 歌词歌词解析解析成行逐行解析 视频播放AndroidView引入Exoplayer自定义Exoplayer样式横竖屏切换 歌曲多任…

单选全选功能实现

单选框&#xff1a; // v-for"i in carStore.cartList" i 是购物车里的单类商品 <el-checkbox :model-value"i.selected" change"(selected)>singeCheck(i,selected)"/>全选框&#xff1a; <el-checkbox :model-value"carSto…

基于Skywalking开发分布式监控(二)

续上篇&#xff0c;上一篇主要是讲了为啥选skywalking&#xff0c;以及怎么有针对性改造SW Agent&#xff0c;现在我们继续看看如何构建自定义Trace跟踪链 要对SW Agent插件做适当剪裁&#xff0c;原来包括customize插件在内SW 8.9有100多个插件&#xff0c;如果没有作用也就罢…

Android:国际化弹出框

3.13 风格与主题、国际化 1、应用国际化 应用国际化&#xff0c;通过修改系统语言&#xff0c;应用显示语言跟着改变。 选择Locale,点击>>符号。 创建多个国家&#xff0c;地区strings.xml文件&#xff0c;有一个默认strings.xml文件&#xff0c;各个stirngs.xml中<…

本地安全策略 | 服务器管理 | 配置项

本地安全策略 Windows 本地安全策略是一组在本地计算机上配置的安全设置&#xff0c;用于管理计算机的安全性和访问控制。这些策略是针对单个计算机的&#xff0c;与域策略不同&#xff0c;本地安全策略不通过域控制器进行集中管理。本地安全策略通过本地组策略编辑器进行配置…

mac电脑flutter环境配置,解决疑难问题

准备工作 首先搭建flutter的环境需要使用到flutter的sdk&#xff0c;可以直接跳去官网下载&#xff1a;Choose your first type of app - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter&#xff0c;下载时要注意你电脑所使用的芯片是Intel的还是苹果的芯片。 下载好的…