STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)

一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别

1. HAL_UART_Transmit_IT(非阻塞模式):

HAL_UART_Transmit_IT 是非阻塞的传输函数,也就是说,当你调用 HAL_UART_Transmit_IT 时,它不会等到数据完全发送完就返回控制权。它会启动一个中断,通知你数据发送完成,允许你继续执行其他任务。这种方式是为了让你在发送数据的过程中,能够继续处理其他操作,不会因为等待数据发送完成而阻塞。

由于数据传输是异步的,当你调用 HAL_UART_Transmit_IT 时,它会立即返回,而数据的发送是由硬件自动完成的。为了保证数据完全发送完毕,你需要通过检查标志位(如 UART_FLAG_TC)或等待 HAL_UART_TxCpltCallback 被调用来确认数据传输已经完成。

如下图,需要通过标志位判断是否发送完成:

2. HAL_UART_Transmit(阻塞模式):

HAL_UART_Transmit 是阻塞的传输函数。也就是说,当你调用 HAL_UART_Transmit 时,函数会阻塞,直到所有数据都被完全发送完毕。它会等待硬件完成数据的发送,并且只有在发送完成后才会返回。你不需要手动检查 UART_FLAG_TC,因为函数本身会等到发送完成才会退出。

3. 为什么 HAL_UART_Transmit_IT 需要判断发送完成,而 HAL_UART_Transmit 不用?

  • 非阻塞 vs 阻塞: HAL_UART_Transmit_IT 是非阻塞的,它只启动发送过程并立即返回,你需要通过中断回调或者标志位来确定发送是否完成。由于它没有等待数据发送完毕,因此你必须在发送后检查是否已完成。

  • 阻塞模式: HAL_UART_Transmit 是阻塞的,函数内部会等待直到数据完全发送完毕,所以你不需要手动检查发送是否完成。

4、示例

错误示例:HAL_UART_Transmit_IT使用时没有标志位判断中断,导致数据被截断,不能接收电脑发送的abc。

数据被截断: 由于 HAL_UART_Transmit_IT 是非阻塞的,它启动了发送后立刻返回。这意味着在你启动 str2 的发送后,可能很快就进入了接收部分,而 UART 的发送缓冲区可能还没有完全发送 str2,此时如果你再次启动发送操作,就会中断之前的发送,导致数据没有完全传输。

正确操作:

或者

正确结果:

二、为什么串口发送不需要断,而接收需要中断

  • 发送数据:

    • 串口数据发送是由软件驱动的过程。一般来说,数据发送到串口的寄存器中后,硬件会负责将其逐个字节发送出去。发送过程中,CPU 主要负责将数据写入寄存器或缓冲区,而并不需要实时监控每一个发送过程。
    • 因为发送的速度通常比较稳定且有足够的时间来处理下一个字节,CPU 可以通过简单的轮询(Polling)方式来确保数据的发送。
    • 串口发送过程中,硬件会根据串口设置(如波特率)自动管理发送队列。当发送缓冲区空闲时,CPU 只需要继续写入数据,或者使用中断通知“数据发送完成”。
  • 接收数据:

    • 接收数据是一个实时性的过程,硬件通过中断来通知 CPU 什么时候有新的数据可以读取。如果不使用中断,CPU 就需要通过轮询的方式不断检查串口接收缓冲区的状态。这对于实时性要求较高的应用来说会增加负担,降低效率。
    • 当接收到一个字节数据时,中断可以直接通知 CPU 进行处理。这使得接收数据更加及时和高效,避免了轮询带来的延迟和 CPU 资源浪费。

接收中断:

如下图:

我们最开始会开启中断,注意:要使用中断启用函数(HAL_UART_Receive_IT)才能真正启用中断,原因我在前几篇的文章有提到过。

这里启用中断后,UART一当检测到接受信号会进入到中断服务函数(HAL_UART_IRQHandler)

接着会进入到回调函数(HAL_UART_RxCpltCallback),执行我们想要的操作了,比如把数据放储存起来。

注意:如果你接收后没有操作,数据虽然接收了,但没有储存,会丢失。

我这里的回调函数是把数据放入到g_RecvChar中,如果我们要检查数据,就去这里面查找。

接收数据的读取:你也可以不读取,反正已经按照你的要求放入容器中了

如上图,我这UART1GetChar(&c)就是去读取被放入容器里面的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学生信息管理系统(简化版)后端接口

目录 allAPI __init__.py是空文件,目的让python知道这个文件夹是个包 ClassInfo.py from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from API.database import get_db, Base from sqlalchemy import Column, String,…

网络安全信息收集(总结)更新

目录 重点: 前言: 又学到了,就是我们什么时候要子域名收集,什么时候收集域名,重点应该放前面 思考: 信息收集分为哪几类,什么是主域名,为什么要收集主域名,为什么要收…

微信小程序从后端获取的图片,展示的时候上下没有完全拼接,有缝隙【已解决】

文章目录 1、index.wxml2、index.js3、detail.detail为什么 .rich-text-style 样式可以生效&#xff1f;1. <rich-text> 组件的特殊性2. 类选择器的作用范围3. 样式优先级4. line-height: 0 的作用5. 为什么直接使用 rich-text 选择器无效&#xff1f; 总结 上下两张图片…

【达梦数据库】存储过程调用实践案例-select

目录 前言创建表插入数据查询表中数据创建存储过程打开dbms_output包输出开关调用存储过程 前言 如果要在存储过程中执行一个SELECT语句并处理其结果&#xff0c;你不能直接使用EXECUTE IMMEDIATE&#xff0c;因为EXECUTE IMMEDIATE主要用于执行那些不返回行的语句&#xff08;…

C语言:指针(第一天)

C语言&#xff1a;指针&#xff08;第一天&#xff09; 预备知识 内存地址 字节&#xff1a;字节是内存的容量单位&#xff0c;英文名byte&#xff0c;一个字节有8位&#xff0c;即1byte8bits地址&#xff1a;系统为了便于区分每一个字节而对他们逐一进行的编号&#xff0c;…

vue3如何实现点击回车,自动登录?

vue3如何实现点击回车&#xff0c;自动登录&#xff1f; 场景&#xff1a;登录账号的时候&#xff0c;可能有的人不习惯直接点击登录&#xff0c;而是通过顺手敲个回车键实现登录 解决办法&#xff1a;上代码 //监听回车 function onKeyUp(e) {//console.log(e)if (e.key En…

LNMP和Discuz论坛

文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…

目标跟踪算法:SORT、卡尔曼滤波、匈牙利算法

目录 1 目标检测 2 卡尔曼滤波 3《从放弃到精通&#xff01;卡尔曼滤波从理论到实践》视频简单学习笔记 3.1 入门 3.2 进阶 3.2.1 状态空间表达式 3.2.2 高斯分布 3.3 放弃 3.4 精通 4 匈牙利算法 5 《【运筹学】-指派问题&#xff08;匈牙利算法&#xff09;》视…

Linux DNS之进阶篇bind-chroot企业级部署方式

BIND-chroot 服务是利用 chroot 机制为 BIND 服务创建伪根目录以限制其访问范围&#xff0c;增强安全性&#xff0c;但配置与维护相对较为复杂的一种服务机制。 本章我们将部署chroot模式的DNS服务&#xff0c;以增加安全性 案例要求&#xff1a; 此案例域名为xjh.com www 解析…

241206学习日志——[CSDIY] [InternStudio] 大模型训练营 [21].md

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

YOLOv5白皮书-第Y2周:训练自己的数据集

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 本人往期文章可查阅&#xff1a; 深度学习总结 接着上一篇文章 YOLOv5白皮书-第Y1周&#xff1a;调用官方权重进行检测 &#xff0c;…

Java的Mvc整合Swagger的knife4框架

Swagger的介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger&#xff0c;就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述 文件可以去更…

共筑数字安全防线,2024开源和软件安全沙龙即将启幕

随着数字化转型进程的加快以及开源代码的广泛应用&#xff0c;开源凭借平等、开放、协作、共享的优秀创作模式&#xff0c;逐渐成为推动数字技术创新、加速传统行业转型升级的重要模式。但随着软件供应链日趋复杂多元&#xff0c;使得其安全风险不断加剧&#xff0c;针对软件供…

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代&#xff0c;音频设备的兼容性和性能成为了用户关注的重点。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB Power Delivery&#xff08;PD&#xff09;协议芯片&#xff0c;凭借其卓越的性能和广泛的应用兼容性&#xff0c;为音频设备领域带来了新…

Linux下mysql环境的搭建

1.mysql的下载 去MySQL官网下载mysql的linux压缩包 MySQL :: Download MySQL Community Server 如果下载慢请到网盘中自行下载 通过网盘分享的文件&#xff1a;mysql-8.0.40-1.el7.x86_64.rpm-bundle.tar 链接: https://pan.baidu.com/s/1vUJ-VuTwer1nLPT-haQCqw?pwd6342 提…

可视化建模以及UML期末复习篇----UML图

这是一篇相对较长的文章&#xff0c;如你们所见&#xff0c;比较详细&#xff0c;全长两万字。我不建议你们一次性看完&#xff0c;直接跳目录找你需要的知识点即可。 --------欢迎各位来到我UML国&#xff01; 一、UML图 总共有如下几种&#xff1a; 用例图&#xff08;Use Ca…

jenkins邮件的配置详解

Jenkins邮件的配置涉及多个步骤和细节,以下是详细的配置指南: 一、前期准备 确定邮件服务:明确Jenkins将要使用的邮件服务,如QQ邮箱、163邮箱、公司邮箱(基于Microsoft 365或Exchange Server)等。获取SMTP配置信息:根据邮件服务类型,获取相应的SMTP服务器地址、端口号…

JaveEE初阶--网络编程套接字

目录 一、引言 二、网络编程基本概念 2.1 什么是网络编程&#xff1f; 2.2 基本知识 三、Socket套接字 3.1 概念 3.2 分类 1.流套接字&#xff1a;使用传输层TCP协议 2. 数据报套接字&#xff1a;使用传输层UDP协议 3.原始套接字&#xff1a;用于自定义传输层协议 四、…

Python爬虫——HTML中Xpath定位

Xpath是一种路径查询语言。利用一个路径表达式从html文档中找到我们需要的数据位置&#xff0c;进而将其写入到本地或者数据库中。 学习Xpath爬虫&#xff0c;我们首先学习一下python中lxml库 关于库 lxml 终端下载Xpath需要用到的模块 pip install lxml 关于HTML 超文本标…