5.STM32的串口通信

news2024/10/11 22:58:58

5.STM32的串口通信

两个串口之间的通信

在这里插入图片描述

发送端口:TX 接受端口:RX

  • 注意一台设备的TX 与 另一台RX相连接

在这里插入图片描述

  • 共地:还需要将两端地线相连接,将设备的参考电势在同一水平(通讯的前提)

建立连接

在cubeIDE中 图形化界面 -> Connectivity -> USART2 -> 将mode改为Asynchronous(异步模式),此时STM32引脚上的PA2和PB3分别被设置为了USART2_TX 和 USART2_RX 就成功将单片机通过数据线和串口与另一端建立连接。

再出现的参数中注意在这里插入图片描述

Baud Rate (波特率) 指的是每秒发送多少次高低电平信号(每秒传送的码元数量),默认情况下,TTL串口没传递一个字节(Byte)也就是8bit的数据,再将数据再加上起始位1,停止位0,也就是传送一字节的信息需要10bit

在这里插入图片描述

所以115200bit/s的波特率下 1秒钟可以传递11520 字节的数据。

其他常见波特率 9600 19200 38400 通信的两设备需要使用相同的波特率才能正常通信

在这里插入图片描述

其他参数保持默认,ctrl+s保存

在这里插入图片描述

在生成的函数中,自动初始化了串口2 ,设置了比特率为115200

串口的轮询模式

串口发送函数

HAL_UART_Transmit(huart,pDate,Size,Timeout);

huart:要操作的串口指针,注意不是指针则需要取地址符

pDate:需要发送的信息的指针,需要类型uint8_t 强制转化(uint8_t *)char类型与uint8_t相同

Size :需要发送的数组长度,通常用sizeof()函数取出pDdate的长度。

Timeout:超时时间,多久之后还没有发送完成的话,就停止发送。最大值HAL_MAX_DELAY无限等待。

串口接收函数

HAL_UART_Receive(huart,pDate,Size,Timeout);

huart:要操作的串口指针,注意不是指针则需要取地址符

pDate:需要接受的变量的指针,需要类型uint8_t

Size:需要接收的数组长度,也就是指令长度,如2,3 ,4

Timeout:超时时间

轮询模式的优缺点

必须要阻塞程序的执行,直到完成发送或接收,或者等待超时

轮询模式的串口发送

在这里插入图片描述

调用函数HAL_UART_Transmit发送一段数据时,STM32的CPU会依次将数据移到寄存器中,发送移位寄存器中的数据会按照我们设定的比特率转化为高低电平从TX引脚输出,发送数据寄存器中的数据会在发送移位寄存器发送完成后,被移动到发送移位寄存器进行下一次发送,而在此过程中,CPU需要不断去查询,发送数据寄存器中的数据是否已经移送到发送移位寄存器,移了的话就赶紧把一下数据塞进来如果没有移动,就不断查询,知道把本次要发送的数据全部发完,或用时超过我们设定的超时时间

轮询模式的串口接收

在这里插入图片描述

原理同发送

可以看到在轮询模式下,不管是发送还是接收CPU一直处于忙碌状态,查询一直等待暂时无法向下执行的状态为“堵塞”,如何解决这种长期占用CPU的堵塞问题

串口的中断模式

只有当发送移位寄存器发送后,触发发送数据寄存器空”中断,才会让CPU来处理发送数据寄存器,cpu在中断处理函数中将数据塞入发送数据寄存器后,就可以去处理其他代码,大大减少了cpu占用时间

操作步骤

1.在图形界面打开USART的中断功能

在这里插入图片描述

中断发送
HAL_UART_Transmit_IT(huart,pDate,Size);

则不需要等待时间参数,其他参数与轮询发送相同。

中断接收
HAL_UART_Receive_IT(huart,pDate,Size);
  • 在代码中,不可直接使用,其中断模式会未接收完毕就继续往下执行,不能再其运行后就立即对数据进行分析

如何知道数据接收完毕,在对数据进行处理,前面说到每当发送移位寄存器发送后,会触发一次“发送数据寄存器空”中断,该函数位置在

stm32f1xx_it.c文件中,每当中断处理时,会调用下面的函数

在这里插入图片描述

打开HAL_UART_IRQHandler(&huart2)内部中的一个函数

在这里插入图片描述

这个函数会在接收完成时就会调用,就能实现在串口接收完成后的第一时刻,对数据进行分析处理了。__weak 函数可以在程序任意位置重新定义

将处理逻辑移入到HAL_UART_RxCpltCallback中即可

  • 注意需要将接收字符串设置在usercode PV变量中。提升为全局变量

  • HAL_UART_RxCpltCallback写在main.c的userCode0中

整个代码就3句,其背后的代码逻辑,需要理解。

在这里插入图片描述

在这里插入图片描述

代码逻辑:

使用HAL_UART_Receive_IT()函数接收来自huart2的消息, HAL_UART_Receive_IT()在中断接收完整的message后触发HAL_UART_RxCpltCallback()串口接收回调函数,将接收到的message通过HAL_UART_Transmit_IT()中断发送消息,之后HAL_UART_Receive_IT()进行等待串口中断接收下一条消息。

通过中断我们成功解决了串口操作一直占用CPU的问题。

但如何接收不确定长度的数据,能否进一步减少CPU的占用呢?

使用扩展函数即可实现,使用DMA搬运数据,下期再见。

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

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

相关文章

独家揭秘!新手铲屎官不可错过的宠物空气净化器选购攻略就在这

终于给我等到了双十一,这可是一年一度的促销力度最大的购物狂欢节,不要问我为什么这么期待,因为我养了猫,猫咪掉毛太严重了,必须得买一个宠物空气净化器,不然我在这个家就呆不下去了。 最近国庆节刚带猫回…

Transactional注解导致Spring Bean定时任务失效

背景 业务需要定时捞取数据库中新增的数据做数据处理及分析,更新状态,处理结束。而我们不能随意定义线程池,规定使用统一的标准规范来定义线程池。如在配置文件中配置线程池的属性:名称,线程核心数等,任务…

用最短长度的绳子把整个花园围起来

给定一个数组 trees,其中 trees[i] [xi, yi] 表示树在花园中的位置。 你被要求用最短长度的绳子把整个花园围起来,因为绳子很贵。只有把 所有的树都围起来,花园才围得很好。 返回恰好位于围栏周边的树木的坐标。 示例 1: 输入: points […

白鲨优化算法(WSO)的MATLAB代码复现

目录 1 白鲨优化算法优化BP神经网络代码复现 2 白鲨优化算法优化支持向量机代码复现 3 白鲨优化算法优化长短期记忆神经网络代码复现 1 白鲨优化算法优化BP神经网络代码复现 1)单输出回归预测:单输出回归预测:大白鲨算法优化BP神经网络模…

OpenCV HoughLine()函数与HoughlinesP()函数及HoughCircles()函数详解及用法示例

OpenCV HoughLine()函数与HoughlinesP()函数都用于图像中的直线检测,但二者是有区别的。 HoughLine()函数 HoughLines()基于霍夫变换的原理,通过投票机制来确定图像中直线的存在及其参数。该函数返回检测到的直线的极坐标参数。它…

【多线程】CAS原理

文章目录 为什么会出现CAS思想?CAS概念CAS自旋概念CAS的简单使用CAS源码解析 UnSafe类CAS底层原理CAS的硬件保证CAS自旋锁的实现前置知识----原子引用AtomicReference实现自旋锁 CAS缺点ABA问题什么是ABA问题如何解决ABA问题简单案例AtomicStampedReference的源码分析 为什么会…

leetcode链表(二)-两两交换链表中的节点

题目 . - 力扣(LeetCode) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 思路 一定要使用虚拟头节点…

电子学报期刊投稿过程记录

电子学报的编辑老师确实人非常好,专业知识过硬,文章内容审核仔细,对格式的要求相对严格,并且打电话或者邮箱询问都很和善,也很温柔,同时也愿意配合再缴费后提前发送录用证明,但是见刊和网络首发…

单点登录Apereo CAS 7.1客户端集成教程

从上一篇部署并成功运行CAS服务端后,我们已经能通过默认的账号密码进行登录。 上篇地址:单点登录Apereo CAS 7.1安装配置教程-CSDN博客 本篇我们将开始对客户端进行集成。 CAS中的客户端,就是指我们实际开发的各个需要登录认证的应用。现在,跟着笔者的步伐,一起探索如何…

共识算法Raft

引入 在分布式系统中,为了消除单点提高系统可用性,通常会创建副本来进行容错,但这会带来另一个问题就是,如何保证多个副本之间的数据一致性。 为了解决这个问题,计算机行内就提出了共识算法,它允许多个分…

git gui基本使用

一、图形化界面 二、创建新项目 创建文件,加入暂存区,提交到版本库 三、创建分支 四、合并分支 1.切换至master 五、更新分支 六、解决冲突 修改冲突,加入暂存区,提交到版本库 七、远程创建库 Gitee - 基于 Git 的代码托管和研…

低功耗

低功耗 目录 低功耗 STM32中的电源系统 STM32 中的低功耗 相关代码 -- 首先我们先看我们做的项目如何降低功耗 -- 对于设备,功耗怎么降低?把设备上所有的电子模块,都进入低功耗模式。 对于空气质量检测仪,如何降低功耗&…

修改armbian DNS服务器地址(永久修改DNS配置)

linux dns服务器地址的配置文件在/etc/resolv.conf 但系统可能设置的是默认值,也就是192.168.1.1。导致系统无法正常解析域名,进而导致有一些接口无法调用或下载失败。 最直接的思路就是修改/etc/resolv.conf,将其中的nameserver修改为正确的…

必看系列:面试官通过一个问题考查了网络编程所有知识点!

一、写在开头 本文的主题是和大家一起探讨学习:“在浏览器中输入URL开始后,计算机所做的几件事”,这个问题是好几年前自己面试的时候,面试官考问过的,当时准备十分不充分,回答的一塌糊涂,今天拿出来再整理学习一遍,一同进步! 其实这个问题本身倒是不难,但它巧妙的是…

节假日提醒,节假日任务,节假日判断如何做?这篇文章教会你!

你是否有这样的需求,有一个任务需要在大家都休息的时候处理,你肯定会想到周六周日了,那不好意思,遇到调休怎么办呢?遇到国假怎么办呢?我这里所说的节假日和工作日不仅仅指正常的周一至周日,还包…

浙江省发规院产业发展研究所调研组莅临迪捷软件考察调研

2024年10月10日下午,浙江省发展与规划院产业发展研究所调研组一行莅临迪捷软件考察调研,绍兴市府办、区发改、区经信、迪荡街道等相关领导陪同。 调研组一行参观了迪捷软件的展厅与办公区,深入了解了迪捷软件的公司发展历程、运营状况、产品…

Python 如何使用 Bert 进行中文情感分析

前言 在自然语言处理(NLP)领域,情感分析是一个非常常见且重要的应用。情感分析通常用于识别文本中的情感,例如判断一条微博或评论是正面、负面还是中性。在过去的几年中,随着深度学习的发展,BERT&#xff…

MySQL表的基本操作和数据类型

MySQL表的基本操作和数据类型 表的操作创建表修改表删除表 数据类型数值类型整型浮点型 文本、二进制类型日期时间类型ENUM类型和SET类型 表的操作 创建表 语法: CREATE TABLE table_name(field1 datatype,field2 datatype,field3 datatype )character set 字符集…

Python的matplotlib可视化工具基本操作(数据分析生成图表)

一、安装导入 1、使用包管理器安装matplotlib pip3 install matplotlib 2、导入plt工具 import matplotlib.pyplot as plt 二、基本函数 1、创建图表 使用pyplot工具打点调用创建图表函数 例如创建直方图: import matplotlib.pyplot as plt import pandas…

【unity框架开发9】序列化字典,场景,vector,color,Quaternion

文章目录 前言一、可序列化字典类普通字典简单的使用可序列化字典简单的使用 二、序列化场景三、序列化vector四、序列化color五、序列化旋转Quaternion完结 前言 自定义序列化的主要原因: 可读性:使数据结构更清晰,便于理解和维护。优化 I…