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.mzph.cn/news/673218.shtml

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

相关文章

【python数据分析基础】—dataframe中index的相关操作(添加、修改index的列名、修改index索引值等)

文章目录 前言一、添加、修改index的列名二、修改index索引值 前言 本文主要讲dataframe结构中index的相关操作&#xff0c;index相当于是数据表的行。 一、添加、修改index的列名 新建一个dataframe表&#xff0c;我们可以自定义index的值&#xff0c;如下&#xff1a; imp…

SSL协议是什么?关于SSL和TLS的常见问题解答

SSL&#xff08;安全套接字层&#xff09;及其后继者TLS&#xff08;传输层安全&#xff09;是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用&#xff0c;但我们仍将这些相关技术称为“SSL”或“SSL/TLS”。那么…

Instagram SEO如何优化?10个技巧

Instagram SEO 是优化 Instagram 内容以使其在平台搜索结果中被发现的做法。如果你希望你可以更快的让你的Ins获得流量&#xff0c;做好SEO就成功了一半。Instagram 搜索结果包括相关内容、帐户、音频、主题标签和地点&#xff0c;下面为你总结10个策略技巧&#xff01; 一、In…

解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

今天又来继续我们的字符串函数的文章&#xff0c;这也是最后一篇了。希望这两篇文章能让各位理解透字符串函数。 目录 strchr strtok sprintf和sscanf strchr strchr 是一个用于在字符串中查找特定字符首次出现位置的函数。以下是解析和模拟实现 strchr 函数的示例&…

【Linux】信号-下

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;信号递达&#xff0c;信号未决&#x…

vue3学习——自定义插件,注册组件(引入vue文件报红线)

在src/components文件夹目录下创建一个index.ts文件 import { App, Component } from Vue import SvgIcon from /components/SvgIcon/index.vue import Pagination from /components/Pagination/index.vue const globalComponents: { [name: string]: Component } { SvgIcon,…

第三模块 面向对象网络并发编程

第三模块 面向对象&网络&并发编程 面向对象基础1. 初识面向对象1.1 对象和self1.2 常见成员1.3 应用示例 2. 三大特性2.1 封装2.2 继承练习题2.3 多态 3. 扩展&#xff1a;再看数据类型总结作业 从今天开始&#xff0c;我们将进入系列课程第3个模块的的学习&#xff0c…

TCP和UDP相关问题(重点)(5)——5.TCP三次握手和四次挥手(非常重要)

5.1三次握手的过程 一次握手&#xff1a;客户端发送带有SYN(x)标志的数据包到服务端&#xff0c;然后客户端进入SYN_SEND状态&#xff0c;等待服务器端的确认。 二次握手&#xff1a;服务端发送带有SYN(y)ACK(x1)标志的数据包到客户端&#xff0c;然后服务端进入SYN_RECV状态。…

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

收到微信发的年终奖。。。

大家好&#xff0c;我是小悟 还剩一天就过除夕了&#xff0c;很多单位都已经放假了&#xff0c;街上的人越来越少&#xff0c;门店关着的很多&#xff0c;说明大家都陆陆续续回自己的家乡过年了。 或许你还在搬砖&#xff0c;坚守节前最后一波工作&#xff0c;或许你正在回家的…

Java学习16-- 面向对象学习45. 面向对象三大特征抽象类和接口

面向对象学习4. 面向对象三大特征 1封装&#xff1a;高内聚(内部细节自己用&#xff0c;外部不能介入)&#xff0c;低耦合(保留很少接口给外部使用)&#xff0c;信息隐藏&#xff08;禁止外界直接访问内部数据(private)&#xff0c;如需要&#xff0c;可通过get/set接口访问&a…

【评论送书】AIGC重塑教育:AI大模型驱动的教育变革与实践

作者&#xff1a;刘文勇 来源&#xff1a;IT阅读排行榜 本文摘编自《AIGC重塑教育&#xff1a;AI大模型驱动的教育变革与实践》&#xff0c;机械工业出版社出版 这次&#xff0c;狼真的来了。 AI正迅猛地改变着我们的生活。根据高盛发布的一份报告&#xff0c;AI有可能取代…

第九个知识点:内部对象

Date对象: <script>var date new Date();date.getFullYear();//年date.getMonth();//月date.getDate();//日date.getDay();//星期几date.getHours();//时date.getMinutes();//分date.getSeconds();//秒date.getTime();//获取时间戳&#xff0c;时间戳时全球统一&#x…

Qt 常用算法及正则表达式

目录 常用算法 正则表达式 常用算法 double c qAbs(a)&#xff0c;函数 qAbs() 返回 double 型数值 a 的绝对值 double max qMax(b,c)&#xff0c;函数 qMax() 返回两个数值中的最大值 int bnqRound(b)&#xff0c;返回一个与浮点数最接近的整数值(四舍五入) int cn q…

玩转量子代码:量子软件入门指南

量子计算领域关注的焦点往往落在硬件上&#xff1a;量子比特和超导电路等。但现在是时候把我们的注意力转移到幕后英雄量子软件上&#xff0c;从将抽象的量子算法转化为可执行的代码到优化电路设计&#xff0c;量子软件起到了举足轻重的作用。 我们在本文中将探究量子编程的基…

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测 目录 多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预…

一文带你搞定搭建自己的组件库Rollup

一文带你搞定搭建自己的组件库(rollup.js) 目前Vue和React都是采用rollup.js进行打包,我们在公司开发的时候也可以用rollup搭建一个自己的组件库放到你的项目中,简化项目的结构项目性能。 接下来我将带你使用rollup从0——1搭建一个在vue中使用的组件库 开发前准备 我的开发…

java Servlet 云平台教学系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP 云平台教学系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 系统采用serlvet dao bean&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据…

Github进不去的解决方法

方案一: 很多人想进入GIthub却总是出现下面的情况,一直转圈圈 这是因为中国大陆是没有Github的服务器的,需要跳到国外的服务器,这个时候需要加速器,或者是选择路劲最佳的路由,这里我介绍一款软件Watt Toolkit 在你们的微软商城里面就可以找到,这个是免费的推荐使用一下 一键加速…

Java图形化界面编程——Container容器 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件&#xff0c;但不能独立存在&#xff0c;它必须内嵌其他容器中使用&#xff0c;默认使用FlowLayout管理其内部组件布局&#xff1b;S…