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)就是去读取被放入容器里面的数据。

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

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

相关文章

使用R语言优雅的获取任意区域的POI,道路,河流等数据

POI是“Polnt of Information”的缩写,中文可以翻译为“信息点”。是地图上任何非地理意义的有意义的点,如商店,酒吧,加油站,医院,车站等。POI,道路网,河流等是我们日常研究中经常需…

七、docker registry

七、docker registry 7.1 了解Docker Registry 7.1.1 介绍 registry 用于保存docker 镜像,包括镜像的层次结构和元数据。启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从registry中下载该镜像并保…

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

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

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值,则会被赋为一个值(可能为白色),否则会赋为另一个值(可能为黑色)。使用的函数是 cv.threshold。第一个参数是源图像,它应该是灰度图像。第二…

【HarmonyOS NEXT】实现Tabs组件的TabBar从左到右依次排列

一、背景 系统提供的Tabs目前只能居中展示,暂不支持居左显示,现有的需求是需要Tabs从左往右排列显示,考虑通过Scroll和Row组件来实现 二、实现思路 通过Scroll和Row组件用来实现一个页签,在onclick事件中通过修改索引值和Tabs组…

16-03、JVM系列之:内存与垃圾回收篇(三)

JVM系列之:内存与垃圾回收篇(三) ##本篇内容概述: 1、执行引擎 2、StringTable 3、垃圾回收一、执行引擎 ##一、执行引擎概述 如果想让一个java程序运行起来,执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。 简…

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称(IOB)2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

【JVM】JVM基础教程(一)

目录 初识JVM JVM是什么? JVM的功能 解释、即时编译和运行 内存管理 常见的JVM JVM虚拟机规范 HotSpot的发展历程 JVM的组成 字节码文件详解 应用场景 以正确姿势打开字节码文件 ​编辑字节码文件的组成 基本信息 Magic魔数 主副版本号 常量池 接口…

无监督学习笔记 - A Cookbook of Self-Supervised Learning

无监督学习笔记 参考资料: 无监督学习Cookbook 几乎总结了所有的自监督学习方法,阅读过程中,根据参考文献索,进一步深入阅读每个方法具体得细节,掌握该论文,基本上就掌握了所有自监督学习的方法与基础。 统计学习方法…

Trimble X9三维激光扫描仪高效应对化工厂复杂管道扫描测绘挑战【沪敖3D】

化工安全关系到国计民生,近年来随着化工厂数字化改革不断推进,数字工厂逐步成为工厂安全管理的重要手段。而化工管道作为工厂设施的重要组成部分,由于其数量多、种类繁杂,一直是企业管理的重点和难点。 传统的化工管廊往往缺乏详…

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时,一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时,就会阻塞等待。 阻塞等待…

【vue3 for beginner】Pinia基本用法:存储user的信息

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库,是 Vuex 的…

动态规划(二) ---斐波那契型深度解析

一、使用最小花费爬楼梯 题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode) 题目:给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一…

记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009

项目是个老项目,依赖包也比较大,咱就按正常流程走一遍来详细解决这个问题,先看一下node版本,我用的是nvm管理的,详细可以看我的其他文章 友情提醒:如果项目比较老,包又大,又有一些需…

Luma 视频生成 API 对接说明

Luma 视频生成 API 对接说明 随着 AI 的应用变广,各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多,从最初的写作,到医疗教育,再到现在的视频。 Luma 是一个专业高质量的视频生成平…

三维扫描检测在汽车制造中的应用

三维扫描,通过先进三维扫描技术获取产品和物体的形面三维数据,建立实物的三维图档,满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维数字化存档、逆向设计、产品开发、直接3D打印制造或辅助加工制造等一系列的应用。 三维扫描…

应用案例 | 船舶海洋: 水下无人航行器数字样机功能模型构建

水下无人航行器数字样机功能模型构建 一、项目背景 为响应水下装备系统研制数字化转型及装备系统数字样机建设的需要,以某型号水下无人航行器(Underwater Unmanned Vehicle,UUV)为例,构建UUV数字样机1.0功能模型。针对…

【unity小技巧】分享vscode如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…

P4645 [COCI2006-2007#3] BICIKLI(Tarjan+topsort求到某点的方案数)

P4645 [COCI2006-2007#3] BICIKLI - 洛谷 | 计算机科学教育新生态 思路: 我们考虑输出inf的情况,可以发现当从1出发到2经过的任意一个点处于一个环内时,路径条数是无穷多的。 有向图上从s到t的经过点,就是从s出发所能经过的所有…

基于eFramework车控车设中间件介绍

车设的发展,起源于汽车工业萌芽之初,经历了机械式操作的原始粗犷,到电子式调控技术的巨大飞跃,到如今智能化座舱普及,远程车控已然成为汽车标配,车设功能选项也呈现出爆发式增长,渐趋多元繁杂。…