使用中断方法实现UART不定长数据接收

2023-05-16

使用中断方法实现UART不定长数据接收

  • 基础知识
    • CubeMx配置
    • 函数说明
    • 代码实现

硬件平台:NUCLEO-STM32F411RE

基础知识

嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。
基本原理:
在这里插入图片描述
常见数据结构:
在这里插入图片描述

CubeMx配置

硬件平台:STM32F411RE-NUCLEO
UART参数:
在这里插入图片描述
这里是用UART2进行数据接受发送
打开UART并设置波特率等:
在这里插入图片描述
打开中断:
在这里插入图片描述

函数说明

1、HAL_UART_Receive_IT和HAL_UART_Receive的区别就是:中断接收是有数据到了才去读;直接接收是直接读取,如果超时就返回

2、HAL_UART_Receive_IT配置后,有数据来,计数会在调用中断函数之后自动减1。只有到计数为0时,才会关闭中断并调用回调函数。至此有数据来不再调用中断函数,因为中断已经失效。

HAL_UART_Transmit
Function name

HAL_StatusTypeDef HAL_UART_Transmit (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)

Function description:
Sends an amount of data in blocking mode.

Parameters:
• huart: Pointer to a UART_HandleTypeDef structure that contains the configuration information for the specified UART module.
• pData: Pointer to data buffer (u8 or u16 data elements).
• Size: Amount of data elements (u8 or u16) to be sent
• Timeout: Timeout duration

Return values
• HAL: status

Notes
• When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. In this case, Size must indicate the number of u16 provided through pData.

HAL_UART_Receive
Function name

HAL_StatusTypeDef HAL_UART_Receive (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)

Function description:
Receives an amount of data in blocking mode.

Parameters
• huart: Pointer to a UART_HandleTypeDef structure that contains the configuration information for the specified UART module.
• pData: Pointer to data buffer (u8 or u16 data elements).
• Size: Amount of data elements (u8 or u16) to be received.
• Timeout: Timeout duration

Return values
• HAL: status

Notes
• When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), the received data is handled as a set of u16. In this case, Size must indicate the number of u16 available through pData.

HAL_UART_Transmit_IT
Function name

HAL_StatusTypeDef HAL_UART_Transmit_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)

Function description
Sends an amount of data in non blocking mode.

Parameters
• huart: Pointer to a UART_HandleTypeDef structure that contains the configuration information for the specified UART module.
• pData: Pointer to data buffer (u8 or u16 data elements).
• Size: Amount of data elements (u8 or u16) to be sent

Return values
• HAL: status

Notes
• When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), the sent data is handled as a set of u16. In this case, Size must indicate the number of u16 provided through pData.

HAL_UART_Receive_IT
Function name

HAL_StatusTypeDef HAL_UART_Receive_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)

Function description
Receives an amount of data in non blocking mode.

Parameters
• huart: Pointer to a UART_HandleTypeDef structure that contains the configuration information for the specified UART module.
• pData: Pointer to data buffer (u8 or u16 data elements).
• Size: Amount of data elements (u8 or u16) to be received.

Return values
• HAL: status

Notes
• When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), the received data is handled as a set of u16. In this case, Size must indicate the number of u16 available through pData.

代码实现

定义一个全局数组用于存放数据

int Rx_pointer = 0;
uint8_t buffer_Rx[100];

main.c中打开中断

uint8_t buffer_Rx[100];

__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);

stm32f4xx_it.c中修改中断处理函数

/**
  * @brief This function handles USART2 global interrupt.
  */
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  // receive interrupt
  if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE))// huart2.Instance->SR & UART_FLAG_RXNE
  {
	  __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
	  Rx_pointer ++;
	  buffer_Rx[Rx_pointer] = huart2.Instance->DR;
  }
  //idle interrupt
  if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE)) // huart2.Instance->SR & UART_FLAG_IDLE
  {
	  if(Rx_pointer!=0)
	  {
		  Rx_pointer = 0;
		  HAL_UART_Transmit(&huart2, buffer_Rx, sizeof(buffer_Rx), 100);//UART发送函数,将收到的重新发出来
	  }
	  __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_IDLE);
	  __HAL_UART_CLEAR_IDLEFLAG(&huart2);//一定要清除IEDLDFLAG 否则会一直卡在中断出不来
  }
  /* USER CODE END USART2_IRQn 1 */
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用中断方法实现UART不定长数据接收 的相关文章

  • Jetson nano串口的使用——UART

    UART串口使用两条杜邦线就可以实现数据发送和接收 xff0c 可以很方便的与其他扩展进行数据连接 xff0c 比如微雪的L76X GPS HAT就可以直接连接40Pin的GPIO接口通过UART串口进行数据传递 接下来具体说明Jetson
  • 03-串口(UART)的使用

    目录 第一节 UART概述1 1 UART的用处 xff1a 1 2 UART的优点1 3 UART原理与概念1 4 UART数据传输原理与过程1 5 关于电平转换1 6 UART内部具体机制 第二节 UART编程 第一节 UART概述 1
  • 串口UART

    目录 串口概念 串口rs232 数据格式 注意事项 总体结构图 代码verilog 接收模块 结构图 波形图 编辑 代码 verilog 发送模块 结构图 波形图 代码 verilog 串口rs485 串口概念 串口是异步 串行通信接口 x
  • 【STM32】UART串口通信详解

    目录 一 数据通信方式 1 串行与并行通信2 全双工 半双工及单工通讯3 同步通讯与异步通讯 二 串口通讯协议 STM32串口简介1 物理层1 RS232标准2 USB转串口 重点 3原生的串口到串口2 协议层1 xff09 通讯的起始和停
  • 串口通信UART

    串口基本概念 串口通讯 Serial Communication 是指外设和计算机间 xff0c 通过数据信号线 地线等 xff0c 按位进行传输数据的一种通讯方式 其通讯协议可分层为协议层和物理层 物理层规定通信协议中具有机械 电子功能的
  • 1、串口(UART/COM/TTL/RS232/RS485)

    目录 串口简介 串行通讯制式 UART 2 1 简介 2 2 电平标准 TTL RS232 RS485 2 3 电平转换 xff08 重点讲解RS232 TTL xff09 USB转TTL USB转RS232 USB转RS485 RS232
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • UART波形分析

    1 逻辑分析仪解码配置 波特率 xff1a 9600 2 逻辑分析仪结果 3 波特率计算 1除以9600 xff0c 结果如下 xff08 e 4表示10的负4次方 xff09 表示 0 00010416秒 61 104 16 微秒 找到发
  • 一文理解UART通信

    还记得当年的打印机 xff0c 鼠标和调制解调器吗 他们都有巨大笨重的连接器和粗电缆 xff0c 并且必须拧到你的电脑上 这些设备正是使用UART协议与计算机进行通信 虽然USB几乎完全取代了旧的电缆和连接器 xff0c 但UART绝对没有
  • UART串口通信协议概述

    1 UART协议介绍 UART是一种通用串行数据总线 xff0c 用于异步通信 UART能实现双向通信 xff0c 在嵌入式设计中 xff0c 常用于主机与辅助设备通信 UART包括RS232 RS449 RS423等接口标准规范和总线标准
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数

    目录 前言1 UART Receive IT2 HAL UART Receive3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • UART串口通信

    串口是 串行接口 的简称 xff0c 即采用串行通信方式的接口 串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送 xff0c 其特点是通信线路简单 xff0c 但传输速度较慢 因此串口广泛应用于嵌入式 工业控制等领域中对数据传输速
  • STM32双串口

    STM32双串口的使用 最近老是需要stm32通过串口去跟WiFi模块 蓝牙模块 openmv进行数据交互 然后需要用到stm32的串口调试 就把这个程序整理成一个工程 方便调试 实验目的 外设模块 WiFi模块 蓝牙模块 openmv 发
  • ESP32-C3入门教程 基础篇(三、UART模块 — 与Enocean无线模块串口通信)

    测试第三课 ESP32 C3的串口通信测试 老样子 使用Enocean无线模块和ESP32 C3进行串口通信 目录 前言 1 UART示例测试 1 1 UART 基础测试 1 2 与Enocean无线模块串口通信测试 2 ESP32 C3
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • GATT 配置文件和 UART 服务

    我是开发通过蓝牙连接到外围设备的移动应用程序的新手 我搜索到 GATT 是用于蓝牙LE 通信的相关配置文件 但我们的客户建议我们使用 UART 服务 现在我很困惑 1 这两件事是如何关联的 2 我们是否必须选择其中之一 如果是的话 每一个的
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过
  • 如何在R中从串口读取数据

    我想绘制来自串行端口的实时数据 我认为 R 将是完成这项工作的好工具 我在尝试从串行端口 COM4 读取数据时遇到了困难 我已经验证数据是通过 terra term 传入的 并在尝试 R 之前关闭会话 但我似乎无法在 R 中获取任何内容 我
  • Android Things 5​​.1 - 9 位 UART

    我正在尝试使用 Android Things 支持 9 位 UART 当我尝试将数据大小设置为 9 时 我收到 IO 异常 唯一有效的配置是 7 位和 8 位 我知道可以使用奇偶校验错误中断进行 9 位模拟 但在 Android 上 我没有

随机推荐

  • Java迭代器详解,看这一篇就够了

    文章目录 x1f6a9 Java 迭代器详解 x1f4da 迭代器的定义 x1f4d2 认识Iterator 类结构图 Iterable接口 x1f58d Iterator接口 x1f4c3 Iterator接口的方法 x1f4d9 迭代器
  • 流式套接字实现简单的客户端/服务端通信过程

    一 实验内容 熟悉流式套接字socket函数的使用方法 xff0c 包括建立连接 数据发送 接收和关闭连接等 xff1b 客户端可向服务端发送任意字符串 xff0c 服务端在接收到该字 符串后 xff0c 回送给客户端 xff1b xff0
  • 实现基于 TCP/IP 协议简单的客户端、服务器通信程序实例

    本篇文章实现了一个基于TCP 的一个非常简单的客户 服务器通信程序实例 该程序中通讯协议使用的是面向连接的TCP协议SOCK STREAM 服务器的ip地址为本地地址即 xff1a 127 0 0 1 xff0c 端口号为自定义的5099
  • ARM:FreeRTOS系统栈和任务栈

    ARM xff1a FreeRTOS系统栈和任务栈 背景 xff1a ARM 有两个栈指针PSP和MSP xff0c 通过Control 寄存器来决定SP R13 使用哪个栈 我们下面谈论的系统栈和任务栈 xff0c 就和这两个栈指针有关
  • cmake编译时对‘xxxx‘未定义的引用问题

    众所周知 c c 43 43 编译过程中在链接阶段偶尔会出现 34 对 xxxx 未定义的引用 34 问题 在复杂的项目中更为常见 经查 大部分博主的关于这方面的博客千篇一律 都指出是头文件未包含的原因 我还是建议大家仔细阅读编译错误信息
  • 进制转换(C++):十六进制、二进制、十进制(附源代码)

    思路如下 xff1a 十进制转二进制 xff1a 除二求余 xff0c 得到低位到高位的二进制数字排列 十进制转八进制 xff1a 除八求余 xff0c 得到低位到高位的八进制数字排列 十进制转十六进制 xff1a 除十六取余 xff0c
  • [C/C++]C语言中math.h和cmath的pow()精度问题

    帮小朋友们DEBUG的时候 xff0c 他们有个题无论怎么提交OJ都不给过 我回来后想了想 xff0c 估计是因为math h库返回值转int时精度丢失的问题 gt 测试代码 include lt stdio h gt include lt
  • c语言自定义寄存器操作的一些方法

    1 寄存器地址的定义 xff1a define UART BASE ADRS 0x10000000 串口的基地址 define UART RHR volatile unsigned char UART BASE ADRS 43 0 数据接受
  • 数字签名-数字证书-ca认证

    数字签名是什么 xff1f 作者 xff1a 阮一峰 今天 xff0c 我读到一篇好文章 它用图片通俗易懂地解释了 xff0c 34 数字签名 34 xff08 digital signature xff09 和 34 数字证书 34 xf
  • Cocos2d-android游戏引擎-介绍

    一 游戏引擎概念 什么是游戏引擎 游戏引擎是指一些已编写好的可编辑游戏系统或者一些交互式实时图像应用程序的核心组件 这些系统为游戏设计者提供各种编写游戏所需的各种工具 xff0c 其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开
  • JAVA语言的三种技术架构

    J2EE Java 2 Platform Enterprise Edition 企业版 是为开发企业环境下的应用程序提供的一套解决方案 该技术体系中包含的技术如Servlet Jsp等 xff0c 主要针对Web应用程序开发 J2SE Ja
  • java中数组排序Arrays.sort(arr)

    import java util 选择排序 class SwitchTest public static void main String args int arr 61 3 5 6 23 45 2 排序前 printArray arr 排
  • java中什么时候使用静态static,工具类的创建

    什么时候使用静态 xff1f 要从两方面下手 xff1a 因为静态修饰的内容有成员变量和函数 什么时候定义静态的变量 类变量 呢 xff1f 当对象中出现共享数据时 xff0c 该数据被静态所修饰 对象中的特有数据要定义成非静态存在于堆内存
  • java面向对象-包package-包与包之间访问-导入包import

    包 package 1 对类文件进行分类管理 2 给类提供多层命名空间 3 写在程序文件的第一行 4 类名的全称是 包名 类名 5 包也是一种封装形式 带包的java文件编译命令 编译 xff1a javac d PackageDemo j
  • String-练习3

    3 xff0c 获取一个字符串在另一个字符串中出现的次数 34 abkkcdkkefkkskk 34 思路 xff1a 1 xff0c 定义个计数器 2 xff0c 获取kk第一次出现的位置 3 xff0c 从第一次出现位置后剩余的字符串中
  • Java基础加强-java5的枚举

    枚举类 xff08 1 xff09 为什么需要枚举 xff1f 一些方法在运行时 xff0c 它需要的数据不能是任意的 xff0c 而必须是一定范围内的值 xff0c 此类问题在JDK5以前采用自定义带有枚举功能的类解决 xff0c Jav
  • Android核心基础-6.Android 耗时操作

    1 什么是ANR 在应用程序的主线程中执行一段耗时的代码 就有可能出现ANR异常 耗时的代码未执行结束时 界面会卡住 用户对界面进行了操作 10秒之后耗时代码如果还未结束 就会出现ANR异常 我们的布局文件中有个TextView和一个按钮B
  • 第9章-WebSocket、Socket.IO和DerbyJS的实时应用程序-9.2.Socket.IO和Express.js

    大多数的实时Web应用程序中 xff0c 服务器和客户端之间的通信发生在响应报文里 xff0c 或者是对用户行为的响应 xff0c 或者是从服务器获取数据更新的结果 安装Socket IO npm install socket io 64
  • 鸟哥的Linux私房菜-第二部分-Linux文件、目录与磁盘格式

    第6章 Linux的文件权限与目录配置
  • 使用中断方法实现UART不定长数据接收

    使用中断方法实现UART不定长数据接收 基础知识CubeMx配置函数说明代码实现 硬件平台 xff1a NUCLEO STM32F411RE 基础知识 嵌入式开发中 xff0c UART串口通信协议是我们常用的通信协议之一 xff0c 全称