串口实验(中断)

news2024/10/6 17:05:26
需求: 通过中断的方法接受串口工具发送的字符串,并将其发送回串口工具。
硬件接线:
同上
串口配置:
4 步同上
5. 打开中断

编程实现:

 

 1、这段代码主要实现了在接收到回车符时判断是否接收到换行符,并标志接收完成。在没有接收到回车符的情况下,根据接收到的字符是否为回车符来更新接收状态和保存接收到的数据。最后,重新开启中断以继续接收。

2、UART1_RX_STA & 0x8000) == 0 表示接收未完成。这是通过检查 UART1_RX_STA 寄存器的最高位(bit15)来确定的。在这个条件中,如果最高位为0,就表示接收未完成。因为在这段代码中,接收完成时会将最高位设置为1(UART1_RX_STA |= 0x8000),因此如果最高位为0,就说明接收还未完成。
3、回车(Carriage Return)的作用是将打印头(或打印滚轴)移回行首,而换行(Line Feed)的作用是将纸上移一行。这两个操作通常结合在一起使用,即先回车再换行,以实现光标的移动到下一行开头。

在计算机系统中,回车符和换行符的概念被继承并广泛应用。而回车符对应的 ASCII 码就是0x0D。

4、UART1_RX_STA = 0; 的作用是将接收状态寄存器 UART1_RX_STA 的所有位都清零,相当于将其重置为初始状态。在这段代码中,这行语句的位置是在接收到回车符(0x0D)但还未接收到换行符(0x0A)的情况下,表示重新开始接收数据。

具体而言,UART1_RX_STA 是一个16位的寄存器,用于记录串口接收的状态。在这个代码中,UART1_RX_STA 的各个位的含义如下:

  • bit15(最高位):接收完成标志,如果为1,表示接收已完成。
  • bit14:接收到回车符(0x0D)标志,如果为1,表示已经接收到回车符。
  • bit13~0:接收到的有效字节数目,记录当前接收到的字节数。

当接收完成时,将 UART1_RX_STA 的最高位设置为1,表示接收完成。而在接收到回车符时,将 UART1_RX_STA 的 bit14 设置为1。当需要重新开始接收时,将 UART1_RX_STA 清零,重新初始化接收状态。这样的设计可以有效地控制串口数据的接收过程。

5、为什么如果没有接收到换行符,可能是接收错误,重新开始?

在串口通信中,通常约定了一种结束符(end-of-line),用于表示一条完整的数据。在这段代码中,回车符(Carriage Return,0x0D)被视为结束符。

如果接收到的字符不是回车符,那么有可能是接收到了错误的数据或者接收的数据不符合约定的格式。为了确保接收的数据是完整的、正确的,程序选择在没有接收到回车符的情况下将接收状态重置,重新开始接收。

else
{
    // 将接收到的数据保存在缓冲区中,使用 UART1_RX_STA 低14位作为索引
    UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;

    // 增加接收状态中记录的有效字节数
    UART1_RX_STA++;

    // 如果接收的数据大于 UART1_REC_LEN(200字节),则重新开始接收
    if (UART1_RX_STA > UART1_REC_LEN - 1)
        UART1_RX_STA = 0;
}
6、具体步骤:
  1. UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;:将接收到的数据 buf 存储在缓冲区 UART1_RX_Buffer 中,使用 UART1_RX_STA 的低14位作为索引。这是为了将数据按顺序存储在缓冲区中。

  2. UART1_RX_STA++;:增加接收状态 UART1_RX_STA 中记录的有效字节数。这是为了跟踪接收的字节数。

  3. if (UART1_RX_STA > UART1_REC_LEN - 1) UART1_RX_STA = 0;:如果接收的数据字节数超过了缓冲区的大小(UART1_REC_LEN),则将接收状态 UART1_RX_STA 重置为0,重新开始接收数据。这是为了防止缓冲区溢出。

这些步骤的目的是将接收到的数据存储在缓冲区中,并在必要时重新开始接收,以保持缓冲区的有效性。

7、假设我们有一个缓冲区 UART1_RX_Buffer,长度为10(UART1_REC_LEN 等于10),初始时 UART1_RX_STA 为0。
  1. 接收到第一个字节(假设是'A'):

    • UART1_RX_STA 增加到1。
    • UART1_RX_Buffer[0] 被赋值为'A',因为 (UART1_RX_STA & 0X3FFF) 等于0。
  2. 接收到第二个字节(假设是'B'):

    • UART1_RX_STA 增加到2。
    • UART1_RX_Buffer[1] 被赋值为'B',因为 (UART1_RX_STA & 0X3FFF) 等于1。
  3. 接收到第三个字节(假设是'C'):

    • UART1_RX_STA 增加到3。
    • UART1_RX_Buffer[2] 被赋值为'C',因为 (UART1_RX_STA & 0X3FFF) 等于2。
  4. ...重复这个过程直到缓冲区满:

    • UART1_RX_STA 依次增加到7,8,9。
    • UART1_RX_Buffer 依次填充为'D'、'E'、'F'、'G'、'H'、'I'、'J'。
  5. 再接收一个字节(假设是'K'):

    • UART1_RX_STA 增加到10。
    • 由于超过了缓冲区长度,根据代码,UART1_RX_STA 会被重新设置为0。
    • UART1_RX_Buffer[0] 被赋值为'K',因为 (UART1_RX_STA & 0X3FFF) 等于0。

这样,UART1_RX_Buffer 中的数据被循环写入,确保缓冲区不会溢出。

 

8、HAL_UART_Receive_IT 函数是在使用 HAL 库时用于启动 UART 中断接收的函数。下面是这个函数的参数解释:
  • &huart1: 这是指向 UART_HandleTypeDef 结构体的指针,表示你要配置的 UART 外设。huart1 应该是你配置的 UART1 的实例,其类型为 UART_HandleTypeDef

  • &buf: 这是一个指向缓冲区的指针,用于存储接收到的数据。在这个例子中,buf 是一个变量,&buf 取得了这个变量的地址,所以 UART 接收到的数据将会存储到 buf 所在的内存位置。

  • 1: 这是期望接收的字节数。在这里,设置为1表示每次接收一个字节。如果你期望接收更多的字节,可以调整这个参数的值。

此函数的作用是启动 UART 中断接收,使 UART 在接收到数据后触发中断,并将接收到的数据存储到指定的缓冲区中。函数参数 &huart1&buf 就是用来传递这些信息的。

9、在这个主循环中,通过检查 UART1_RX_STA 的最高位(bit15),判断是否接收完成。如果接收完成,就打印收到的数据,然后通过串口发送出去。在等待发送完成的过程中,阻塞等待 huart1.gState 变为 HAL_UART_STATE_READY,确保上一次的发送已经完成。最后,将 UART1_RX_STA 重置为0,准备开始下一次的接收。

如果接收未完成,会执行其他操作,比如打印 "hello liangxu" 和延时1秒。

这个循环将不断运行,周期性地进行串口接收和其他操作。主要的思路是在串口接收完成后进行处理,然后重新开始下一次接收。

 

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

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

相关文章

正态总体的区间估计

目录 一、区间估计 1.区间估计原理 2.区间估计定义 二、三大分布 1.正态分布 2.χ分布 3.t分布 三、 情况分类 1. μ 的区间估计 (1)已知σ (2)未知σ 2. σ的区间估计 四、公式推导 1.标准正态分布 2.t分布 3. χ分布 五、例题 一、区间估计 1.区间估计原理…

前沿重器[39] | 对话式推荐系统——概念和技术点

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经…

P1单片机定时器配置及定时器中断——C51(超详细)

目录 1. 简介 1.1 概念解读 1.2 定时器怎么定时 1.什么是晶振 2.什么是时钟周期 3.什么是机器周期 4.加1经过了多少时间 1.3 定时器编程 1.如何算出10ms定时器的初值(TL0 TH0) 2.关于TCON ,怎么知道爆表 3.怎么开始计时(TR0) 4.定时器使用是有很多种模式的&#xf…

sylar高性能服务器-配置(P10-p11)代码解析+调试分析

文章目录 p9:配置模块搭建一、ConfigvarBase二、ConfigVar三、Config四、小结 p10:YAML的使用一、安装yaml-cpp二、使用yaml-cpp三、代码解析 P11:YAML与日志的整合一、方法函数二、代码调试三、test_config结果四、小结 p9:配置模…

2023年全球软件开发大会(QCon广州站2023)-核心PPT资料下载

一、峰会简介 本次峰会包含:泛娱乐时代的边缘计算与通讯、稳定性即生命线、下一代软件架构、出海的思考、现代数据架构、AGI 与 AIGC 落地、大前端技术探索、编程语言实战、DevOps vs 平台工程、新型数据库、AIGC 浪潮下的企业出海、AIGC 浪潮下的效能智能化、数据…

联邦边缘学习中的知识蒸馏综述

联邦边缘学习中的知识蒸馏综述 移动互联网的快速发展伴随着智能终端海量用户数据的产生。如何在保护数据隐私的前提下,利用它们训练出性能优异的机器学习模型,一直是业界关注的难点。为此,联邦学习应运而生,它允许在终端本地训练并协同边缘服务器进行模型聚合来实现分布式机器…

C++字符串插入函数(insert)

1.在下标为n处插入y #include <iostream> #include <algorithm> #include <string> using namespace std;string x,y; int n;int main() {cin>>x>>y>>n;x.insert(n,y); //在下表为n处插入ycout<<x<<endl;return 0; }2…待续

十几个软件测试实战项目【外卖/医药/银行/电商/金融】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…

【TiDB理论知识10】TiDB6.0新特性

新特性 Placement Rules in SQL 小表缓存 内存悲观锁 Top SQL TiDB Enterprise Manager 一 Placement Rules in SQL Placement Rules in SQL 之前会遇到的问题 比如 北京的业务需要访问 T2 和 T3表 &#xff0c;但是T3表的数据在纽约 纽约的业务需要问访T4 T5 T6表…

基于PaddleNLP的深度学习对文本自动添加标点符号(一)

前言 目前以深度学习对文本自动添加标点符号研究很少&#xff0c;已知的开源项目并不多&#xff0c;详细的介绍就更少了&#xff0c;但对文本自动添加标点符号又在古文识别语音识别上有重大应用。 基于此&#xff0c;本文开始讲解基于PaddleNLP的深度学习对文本自动添加标点符号…

js 有关递归简单介绍

递归&#xff1a;指调用自身的函数 重点&#xff1a;递归函数必须有可以终止递归调用的语句&#xff0c;否则会导致内存溢出 递归的性能不好&#xff0c;因为在递归终止前&#xff0c;JavaScript引擎会为每一次递归分配一块内存以存储栈帧&#xff0c;随着递归的深入&#xff…

【C语言】结构体实现位段

引言 对位段进行介绍&#xff0c;什么是位段&#xff0c;位段如何节省空间&#xff0c;位段的内存分布&#xff0c;位段存在的跨平台问题&#xff0c;及位段的应用。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;…

力扣每日一题----2008. 出租车的最大盈利

这题我们是怎么思考的呢&#xff1f; 已知有乘客最多30000个&#xff0c;有最多100000个地点&#xff0c;那么通过算法时间复杂度&#xff0c;不可能是O(n^2), 那么我们就可以去看题目&#xff0c;题目又是最多盈利多少元&#xff1f;那么很容易联想到动态规划&#xff0c;并…

9:00面试,9:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

支持向量机模型(超详细,含案例代码)

什么是支持向量机&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种在机器学习领域中用于分类和回归分析的强大算法。它是一种监督学习算法&#xff0c;其目标是在特征空间中找到一个超平面&#xff0c;将不同类别的数据点分开&…

Axure元件的介绍使用与登录界面以及个人简历的绘制

目录 一.Axure元件介绍 1.1.简介 1.2.常见的元件 1.3.元件的操作 二.基本元件的使用 2.1.矩形和圆形 2.2.图片 2.3.文本元件 2.4.热区 2.5.线段元件 三.表单型元件的使用 3.1.文本框 3.2.文本域 3.3.下拉列表 3.4.列表框 3.5.单选按钮 3.6.复选框 四.菜单和表…

2007-2022年全国各省数字经济政策支持力度、ZF工作报告数据经济词频数据

2007-2022年全国各省数字经济政策支持力度、ZF工作报告数据经济词频数据, 1、时间&#xff1a;2007-2022年 2、范围&#xff1a;31省市 3、指标&#xff1a;行政区划代码、年份、地区、所属地域、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频-精确模式、…

dockerfile基于NMP+wordpress创建镜像

内部通信地址 nginx 172.111.0.10 docker-nginx mysql 172.111.0.20 docker-mysql php 172.111.0.30 docker-php 1、创建单独目录 2、创建容器的自定义网络 docker network create --subnet172.111.0.0/16 --opt "com.docker.network.bridge.name"&quo…

19、命令模式(Command Pattern,不常用)

命令模式&#xff0c;将一个请求封装为一个对象&#xff08;命令&#xff09;&#xff0c;使发出请求的责任和执行请求的责任分割开&#xff0c;有效降低系统的耦合度。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行储存、传递、调用、增加与管理。命令…

磁力计LIS2MDL开发(1)----轮询获取磁力计数据

磁力计LIS2MDL开发.1--轮询获取磁力计数据 概述视频教学样品申请源码下载通信模式速率生成STM32CUBEMX串口配置IIC配置CS设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置速率启用偏移消除开启温度补偿设置为连续模式轮询读取数据主程序演示 概述 本文将介绍如何使…