STM32-USART串口实现接收数据三种方法(1.根据\r\n标志符、2.空闲帧中断、3.根据定时器辅助接收)

本章概述思维导图:

USART串口初始化配置

串口初始化配置在(STM32-USART串口初始化章节有详细教程配置),本章不做讲解直接代码示例,本章重点在于串口实现接收数据三种方法;

配置USART1串口接收初始化函数步骤:

1. 开时钟

2. 对串口1模块开启复位时钟,在取消复位;

3. 配置GPIO模式

4. 通过在USART_CR1寄存器上置位UE位来激活USART

5. 编程USART_CR1的M位来定义字长。

6. 在USART_CR2中编程停止位的位数。

7. 利用USART_BRR寄存器选择要求的波特率。

8. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。

9. 设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。

10. 设置USART_CR1的IDLEIE位。当USART_SR中的IDLE为’1’时,产生USART中断

11.设置USART_CR1的RXNEIE位。当USART_SR中的ORE或者RXNE为’1’产生USART中断。

12. 调用中断设置优先级函数;

代码示例:

/*USART1串口初始化函数形参bps——>保持通信的波特率PA10设置为输入模式,PA9设置为复用输出模式;
*/
void USART1_Init(u32 bps)
{
//  1. 开时钟RCC->APB2ENR|=1<<2;//开启PA时钟;RCC->APB2ENR|=1<<14;//开启USART1时钟
//  2. 对串口1模块开启复位时钟,在取消复位;RCC->APB2RSTR|=1<<14;//开启USART1复位时钟,复位这一步可以省略配置USART1步骤RCC->APB2RSTR&=~(1<<14);//取消复位时钟,关闭复位
//  3. 配置GPIO模式GPIOA->CRH&=0xfffff00f;//清空PA10、PA9引脚模式GPIOA->CRH|=0x000008b0;//PA10输入PA9输出
//  4.通过在USART_CR1寄存器上置位UE位来激活USARTUSART1->CR1|=1<<13;
//  5.编程USART_CR1的M位来定义字长。USART1->CR1&=~(1<<12);
//  6.在USART_CR2中编程停止位的位数。USART1->CR2&=~(0x3<<12);
//  7.利用USART_BRR寄存器选择要求的波特率。USART1->BRR=72000000/bps;
//  8.设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。USART1->CR1|=1<<3;
//  9.设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。USART1->CR1|=1<<2;
//  10.设置USART_CR1的IDLEIE位。当USART_SR中的IDLE为’1’时,产生USART中断USART1->CR1|=1<<4;
//  11.设置USART_CR1的RXNEIE位。当USART_SR中的ORE或者RXNE为’1’产生USART中断。USART1->CR1|=1<<5;
//  12.调用中断优先级函数STM32_SetNVICPriority(USART1_IRQn ,1,1);
}

USART串口中断服务函数

/*串口1中断服务函数
*/
void USART1_IRQHandler()
{u8 c;if(USART1->SR&1<<5)//判断是否为:接收中断;每接收一个字符就会触发一次中断{c=USART1->DR;//将数据赋值给cUSART1->DR=c;//将数据发生给上位机软件,使得显示界面上显示。}
}

USART1串口1接收实现三种方法

判断串口数据发送完一次数据有三种方法:

1. 是发送数据时以(\r\n)标志为结尾,检测到(\n)时就知道数据完成一次发送

2. 串口初始化函数中开启空闲帧中断

3,定时器辅助串口接收,判断串口1发送一字节和下一字节的间隔时间。超过定时器 初始设定的时间说明字符串数据发送完成

方法1:这里判断一次数据发送完成时根据(\r\n结束标志符)

代码示例:

u8 USART1_buffer[1024];//缓冲区数组,用来接收数据
u16 USART1_cnt=0;//缓冲区数组下标
u8 USART1_flag=0;//联合主函数标志位
/*USART1串口1中断服务函数
*/
void USART1_IRQHandler(void)
{u8 dat;if(USART1->SR&1<<7)//没接收到一个字符触发标志位{dat=USART1->DR;//读取数据if(USART1_cnt<1024){USART1_buffer[USART1_cnt]=dat;//将读取的数据放入到缓冲区数组里if(USART1_buffer[USART1_cnt] == '\n')//判断是否到结束标注位"\r\n"{USART1_buffer[USART1_cnt-1]='\0';//将'\r'写入'\0'结束USART1_flag=1;//数据接收完成}else{USART1_cnt++;}}else{USART1_buffer[USART1_cnt-1]='\0';USART1_cnt=0;}}
}

代码讲解:

创建缓冲区数组用来接收字符,只要字符不为:' \n ';就一直接收;当字符为:' \n '时;将' \r'位置写入' \0 '表示接收完成,同时将标志位置1,联合主函数使用;

主函数代码示例:


#include "USART1.h"
#include "stdio.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函数while(1){if(USART1_flag){printf("buffer=%s\tcnt=%d\n",USART1_buffer,USART1_cnt);USART1_cnt=0;//下标清零USART1_flag=0;//标志位置0;}}
}

代码运行结果图:

数据发送图:

数据成功接收图:

方法2:开启空闲帧中断

在串口初始化函数中配置USART1_CR1的IDLEIE:IDLE中断使能位

中断服务函数配置示例代码:

/*USART1串口1中断服务函数
*/
void USART1_IRQHandler(void)
{u8 dat;if(USART1->SR&1<<5)//每接收到一个字符触发标志位{dat=USART1->DR;//读取数据if(USART1_cnt<1024){USART1_buffer[USART1_cnt]=dat;//将读取的数据放入到缓冲区数组里USART1_cnt++;}else{USART1_cnt=0;} }if(USART1->SR&1<<4)//空闲帧标志,这是全部发送完触发一次{dat=USART1->DR;USART1_flag=1;//数据接收完成}USART1->SR=0;
}

主函数示例代码:

#include "USART1.h"
#include "stdio.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函数while(1){if(USART1_flag){USART1_buffer[USART1_cnt]='\0';//写入结束标志符printf("buffer=%s\tcnt=%d\n",USART1_buffer,USART1_cnt);USART1_cnt=0;//下标清零USART1_flag=0;//标志位置0;}}
}

代码运行结果图:

数据发送图:

数据成功接收图:

方法3:定时器辅助串口接收

定时器辅助串口接收,判断串口1发送一字节和下一字节的间隔时间。超过定时器 初始设定的时间说明字符串数据发送完成

配置步骤:

第一步:算出发送一个字节数据要多少时间:

1m=1000ms=1000000us;

1000000/(115200/10)=86.80555555us;发送一字节数据需要86.8055微秒;

判断第一个字节数据和第二字节数据的间隔时间有没有超过10ms

第二步:在串口1初始化函数中关闭空闲帧中断并且串口中断服务函数里关闭空闲帧中断; 在定时器2初始化函数里关闭使能计数器,并且关闭定时器。设定定时时间10毫 秒

第三步:在串口第一次接收一字节数数时,在串口1中断服务函数里清空计数器并且开启定 时器。

第四步:如果数据全部返送完成,在定时器2中断服务函数里将标志位置一并且关闭定时器 等待下一次数据发送玩出触发定时器2中断

第三步示例代码:

/*USART1串口1中断服务函数
*/
void USART1_IRQHandler(void)
{u8 dat;if(USART1->SR&1<<5)//每接收到一个字符触发标志位{dat=USART1->DR;//读取数据if(USART1_cnt<1024){TIM2->CNT=0;//清空计数器TIM2->CR1|=1<<0;//开启定时器USART1_buffer[USART1_cnt]=dat;//将读取的数据放入到缓冲区数组里USART1_cnt++;}else{USART1_flag=1;} }USART1->SR=0;
}

第四步示例代码:

/*定时器2中断服务函数
*/
void  TIM2_IRQHandler(void)
{if(TIM2->SR&1<<0){USART1_flag=1;//定时时间到标志位置1TIM2->SR&=~(1<<0);TIM2->CR1&=~(1<<0);//关闭定时器}
}

主函数示例代码:


#include "USART1.h"
#include "stdio.h"
#include "TIM.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函数TIM2_Init(7200,10000);//定时器2设置定时时间为10毫秒while(1){if(USART1_flag){USART1_buffer[USART1_cnt]='\0';//给缓冲区数组写入结束标识符;printf("buffer=%s cnt=%d\n",USART1_buffer,USART1_cnt);USART1_cnt=0;//下标清零USART1_flag=0;//标志位置0;}}
}

代码运行结果图:

数据发送图:

数据成功接收图:


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

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

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

相关文章

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博评论数据可视化分析-点赞区间折线图实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解微博评论数据可视化分析-点赞区间折线图实现…

Unity_SRP Batcher

SRP Batcher 全面解析&#xff1a;原理、启用、优化与调试一、什么是 SRP Batcher&#xff1f;SRP Batcher 是 Unity Scriptable Render Pipeline&#xff08;URP、HDRP 或自定义 SRP&#xff09; 专属的 CPU 渲染性能优化技术&#xff0c;核心目标是 减少材质切换时的 CPU 开销…

详解Vite 配置中的代理功能

在前端开发过程中&#xff0c;你可能经常会遇到一个头疼的问题&#xff1a;当你在本地启动的前端项目中调用后端接口时&#xff0c;浏览器控制台会报出类似 “Access to fetch at ‘http://xxx’ from origin ‘http://localhost:3000’ has been blocked by CORS policy” 的错…

理解梯度在神经网络中的应用

梯度&#xff08;Gradient&#xff09;是微积分中的一个重要概念&#xff0c;广泛应用于机器学习和深度学习中&#xff0c;尤其是在神经网络的训练过程中。下面将从梯度的基本概念、其在神经网络中的应用两个方面进行详细介绍。一、梯度的基本概念 1.1 什么是梯度&#xff1f; …

WPF,按钮透明背景实现MouseEnter

在帮手程序&#xff08;assister.exe&#xff09;中&#xff0c;可以点击录制按钮&#xff0c;实现录制用户操作直接生成操作列表。而在弹出录制按钮的悬浮窗中&#xff0c;需要能够拖动录制按钮放置在任意的位置&#xff0c;以免阻挡正常的窗口。具体功能是&#xff0c;当鼠标…

【抄袭】思科交换机DAI(动态ARP监控)配置测试

一.概述 1.DAI作用 ①.使用DAI&#xff0c;管理员可以指定交换机的端口为信任和非信任端口&#xff1a; 信任端口可以转发任何ARP信息 非信任端口的ARP消息要进行ARP检测验证 ②.交换机执行如下的ARP验证&#xff1a; 静态ARP监控&#xff1a;为一个静态的IP地址配置一个静态AR…

在嵌入式系统或 STM32 平台中常见的外设芯片和接口

在嵌入式系统或 STM32 平台中常见的 外设芯片 或 模块名称&#xff0c;包括&#xff1a; &#x1f4fa; 显示驱动&#xff08;如 ST7735、OTM8009A、NT35510&#xff09;&#x1f4f7; 摄像头模组&#xff08;如 OV5640、OV9655、S5K5CAG&#xff09;&#x1f4be; Flash 存储器…

AI 类型的 IDE

指集成了 AI 辅助编程能力的集成开发环境 一、代码辅助生成 ✅ 自动补全&#xff08;更智能&#xff09; 比传统 IDE 更智能&#xff0c;理解上下文&#xff0c;生成整个函数/模块 示例&#xff1a;根据函数名 calculateTax 自动生成税务计算逻辑 ✅ 函数 / 类自动生成 给…

JP3-3-MyClub后台后端(一)

Java道经 - 项目 - MyClub - 后台后端&#xff08;一&#xff09; 传送门&#xff1a;JP3-1-MyClub项目简介 传送门&#xff1a;JP3-2-MyClub公共服务 传送门&#xff1a;JP3-3-MyClub后台后端&#xff08;一&#xff09; 传送门&#xff1a;JP3-3-MyClub后台后端&#xff08;…

架构实战——互联网架构模板(“存储层”技术)

目录 一、SQL 二、NoSQL 三、小文件存储 四、大文件存储 本文来源:极客时间vip课程笔记 一、SQL SQL 即我们通常所说的关系数据。前几年 NoSQL 火了一阵子,很多人都理解为 NoSQL 是完全抛弃关系数据,全部采用非关系型数据。但经过几年的试验后,大家发现关系数据不可能完全被…

CentOS7.9在线部署Dify

一、CentOS7.9安装dify 二、检查是否安装dcoker docker --version2.1下载后将安装包上传至服务器对应文件夹下,我选在放在了 /root文件夹下 cd /root2.2 上传至服务器 cd /root #对应目录下tar -xvf docker-26.1.4.tgz # 解压安装包:chmod 755 -R docker # 赋予可执…

深入浅出C语言指针:从数组到函数指针的进阶之路(中)

指针是C语言的灵魂&#xff0c;也是初学者最头疼的知识点。它像一把锋利的刀&#xff0c;用得好能大幅提升代码效率&#xff0c;用不好则会让程序漏洞百出。今天这篇文章&#xff0c;我们从数组与指针的基础关系讲起&#xff0c;一步步揭开指针进阶类型的神秘面纱&#xff0c;最…

java web Cookie处理

java web 设置cookie更改启动端口// Directory tree (5 levels) ├── src\ │ ├── a.txt │ └── com\ │ └── zhang\ │ └── ServletContext\ │ ├── cookie\ │ └── servletContext.java └── web\├─…

机器学习—线性回归

一线性回归线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。相关关系&#xff1a;包含因果关系和平行关系因果关系&#xff1a;回归分析【原因引起结果&#xff0c;需要明确自变量和因变量】平行关系&#xff1…

Spring Boot Admin 监控模块笔记-实现全链路追踪

一、概述Spring Boot Admin&#xff08;SBA&#xff09;是一个用于监控和管理 Spring Boot 应用程序的工具。它提供了一个 Web 界面&#xff0c;可以集中管理多个 Spring Boot 应用程序的健康状态、指标、日志、配置等信息。通过 SBA&#xff0c;你可以轻松地监控和管理你的微服…

容器化与Docker核心原理

目录 专栏介绍 作者与平台 您将学到什么&#xff1f; 学习特色 容器化与Docker核心原理 引言&#xff1a;为什么容器化成为云计算时代的基石&#xff1f; 容器化技术全景与Docker核心原理&#xff1a;从概念到实践 文章摘要 1. 引言&#xff1a;为什么容器化成为云计算…

掌握Python三大语句:顺序、条件与循环

PS不好意思各位&#xff0c;由于最近笔者在参加全国大学生电子设计大赛&#xff0c;所以最近会出现停更的情况&#xff0c;望大家谅解&#xff0c;比赛结束后我会加大力度&#xff0c;火速讲Python的知识给大家写完&#x1f396;️&#x1f396;️&#x1f396;️&#x1f396;…

JAVA结合AI

Java 与人工智能&#xff08;AI&#xff09;的结合正经历从技术探索到深度融合的关键阶段。以下从技术生态、应用场景、工具创新、行业实践及未来趋势五个维度展开分析&#xff0c;结合最新技术动态与企业级案例&#xff0c;揭示 Java 在 AI 时代的独特价值与发展路径。一、技术…

本土DevOps平台Gitee如何重塑中国研发团队的工作流

本土DevOps平台Gitee如何重塑中国研发团队的工作流 在数字化转型浪潮席卷各行各业的当下&#xff0c;软件开发效率已成为企业竞争力的核心指标。Gitee DevOps作为专为中国开发团队打造的本土化研发管理平台&#xff0c;正在改变国内技术团队的工作方式。该平台通过从代码管理到…

5G MBS(组播广播服务)深度解析:从标准架构到商用实践

一、MBS技术背景与核心价值 1.1 业务需求驱动 随着超高清视频(4K/8K)、多视角直播、XR元宇宙应用爆发式增长,传统单播传输面临带宽浪费(相同内容重复发送)与拥塞风险(万人并发场景)的双重挑战。5G MBS通过点对多点(PTM)传输实现内容一次发送、多终端接收,频谱效率提…