STM32 串口接收定长,不定长数据

2024-04-13 13:36

本文主要是介绍STM32 串口接收定长,不定长数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文为大家介绍如何使用 串口 接收定长 和 不定长 的数据。

文章目录

  • 前言
  • 一、串口接收定长数据
      • 1. 函数介绍
      • 2.代码实现
  • 二、串口接收不定长数据
      • 1.函数介绍
      • 2. 代码实现
  • 三,两者回调函数的区别比较
  • 四,空闲中断的介绍
  • 总结


前言

一、串口接收定长数据

1. 函数介绍

  1. 开启串口的接收中断:
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

参数:

  • huart:这是一个指向 UART_HandleTypeDef 结构体的指针,用于标识特定的 UART 外设实例。该结构体包含了该 UART 实例的各种配置和状态信息。

  • pData:这是一个指向存储接收数据的缓冲区的指针。当接收到数据时,数据将被存储在该缓冲区中。

  • Size:这是要接收的数据的字节数。函数将尝试从 UART 接收指定数量的字节到 pData 缓冲区中。

  1. 串口接收完成回调函数:
// 当串口接收到数据就调用该回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{}

参数:

  • huart:这是一个指向 UART_HandleTypeDef 结构体的指针,用于标识特定的 UART 外设实例。该结构体包含了该 UART 实例的各种配置和状态信息。

2.代码实现

// 接收数据的缓冲区
uint8_t recv_buff = 0;// 1. 开启串口接收中断(每次只接收1位数据)
HAL_UART_Receive_IT(&huart1, &recv_buff, 1);/* 2.中断的方式接收定长的数据 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){			if(recv_buff == 'A'){printf("recv : A \r\n");}else if(recv_buff == 'B'){printf("recv : B \r\n");}// 再次开启串口接收中断(每次只接收1位数据)HAL_UART_Receive_IT(&huart1, &recv_buff, 1);}
}

二、串口接收不定长数据

这里会引入空闲中断,至于什么是空闲中断 在第四大点中会介绍。

1.函数介绍

  1. 开启串口空闲接收中断
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

参数:

  • huart:UART 句柄,指向正在使用的串口设备。
  • pData:存储接收数据的缓冲区的指针。
  • Size:期望接收的数据字节数。
  1. 串口接收事件回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{}

参数:

  • huart:UART 句柄,指向正在使用的串口设备。
  • Size:接收到的数据字节数。

2. 代码实现

uint8_t recv_buff[20] = {0}; // 定义一个长度为 20 的接收缓冲区// 1.打开空闲接收中断
HAL_UARTEx_ReceiveToIdle_IT(&huart1, recv_buff, sizeof(recv_buff));// 2. 空闲中断时调用的回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart->Instance == USART1) // 检查是否为 USART1 串口{recv_buff[Size] = '\0'; // 在接收到的数据末尾添加字符串结束符if(strcmp((char*)recv_buff, "LED ON") == 0){printf("led on is ok\r\n");}else if(strcmp((char*)recv_buff, "LED OFF") == 0){printf("led off is ok\r\n"); }}// 重新开启空闲接收中断,继续监听串口数据HAL_UARTEx_ReceiveToIdle_IT(&huart1, recv_buff, sizeof(recv_buff));
}

三,两者回调函数的区别比较

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size);

这两个函数都是串口接收的回调函数,但是它们在触发时机上有所不同:

  • HAL_UART_RxCpltCallback 函数是标准的 HAL 库提供的串口接收完成回调函数。它在每次成功接收到指定数量的数据后被调用,即每当接收完成一个数据包时触发一次。

  • HAL_UARTEx_RxEventCallback 函数是 HAL 扩展库提供的串口接收事件回调函数。它可以在串口接收到特定事件时被调用,比如接收到空闲状态时触发。这个函数可以用于处理更多的接收事件,而不仅仅是每次接收完成一个数据包时触发。

因此,区别在于 HAL_UARTEx_RxEventCallback 函数可以处理更多类型的接收事件,而 HAL_UART_RxCpltCallback 函数仅在每次接收完成一个数据包时触发

四,空闲中断的介绍

在这里插入图片描述

一帧数据传输结束后,通信线路将会维持高电平,这个状态称为空闲状态。当 CPU 检测到通信线路处于空闲状态时,且空闲状态持续时间大于一个字节传输时间时将会触发空闲中断 。空闲中断的触发通常表示一次完整的数据传输已经结束。

当 产生空闲中断后,会调用 空闲中断的接收事件回调函数,将接收到的数据全部打印出来,这样就可以实现不定长数据的接收。

应用场景:

  1. 串口通信中的数据帧解析: 在串口通信中,空闲中断常用于解析数据帧。一旦检测到空闲中断,就可以确定一帧数据已经接收完整,并开始解析其中的数据。

  2. 数据接收超时处理: 空闲中断可以用于实现数据接收的超时处理。如果一定时间内未触发空闲中断,可以认为数据接收超时,并进行相应的处理,例如丢弃接收缓冲区中的数据或发出超时警告。

  3. 多任务环境下的数据同步: 在多任务系统中,空闲中断可以用于实现任务之间的数据同步。当一个任务接收到完整的数据帧后,可以通过触发空闲中断来通知其他任务进行相关操作或处理。

总之,空闲中断在串口通信中具有重要的作用,用于检测数据传输的完成和触发相应的处理操作,适用于各种数据接收和处理场景。


总结

下一篇文章为大家介绍 串口 UART 协议.。

这篇关于STM32 串口接收定长,不定长数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900281

相关文章

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和业务增长。 数字化转型行业小伙伴可以加入我的星球,初衷成为各位数字化转型参考库,星球内容每周更新 个人工作经验资料全部放在这里,包含数据治理、数据要

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳

两个基因相关性CPTAC蛋白组数据

目录 蛋白数据下载 ①蛋白数据下载 1,TCGA-选择泛癌数据  2,TCGA-TCPA 3,CPTAC(非TCGA) ②蛋白相关性分析 1,数据整理 2,蛋白相关性分析 PCAS在线分析 蛋白数据下载 CPTAC蛋白组学数据库介绍及数据下载分析 – 王进的个人网站 (jingege.wang) ①蛋白数据下载 可以下载泛癌蛋白数据:UCSC Xena (xena

中国341城市生态系统服务价值数据集(2000-2020年)

生态系统服务反映了人类直接或者间接从自然生态系统中获得的各种惠益,对支撑和维持人类生存和福祉起着重要基础作用。目前针对全国城市尺度的生态系统服务价值的长期评估还相对较少。我们在Xie等(2017)的静态生态系统服务当量因子表基础上,选取净初级生产力,降水量,生物迁移阻力,土壤侵蚀度和道路密度五个变量,对生态系统供给服务、调节服务、支持服务和文化服务共4大类和11小类的当量因子进行了时空调整,计算了

【计算机网络篇】数据链路层(12)交换机式以太网___以太网交换机

文章目录 🍔交换式以太网🛸以太网交换机 🍔交换式以太网 仅使用交换机(不使用集线器)的以太网就是交换式以太网 🛸以太网交换机 以太网交换机本质上就是一个多接口的网桥: 交换机的每个接口考研连接计算机,也可以理解集线器或另一个交换机 当交换机的接口与计算机或交换机连接时,可以工作在全双工方式,并能在自身内部同时连通多对接口,使每一对相互通信的计算机都能像

使用Jsoup抓取数据

问题 最近公司的市场部分布了一个问题,到一个网站截取一下医院的数据。刚好我也被安排做。后来,我发现为何不用脚本去抓取呢? 抓取的数据如下: Jsoup的使用实战代码 结构 Created with Raphaël 2.1.0 开始 创建线程池 jsoup读取网页 解析Element 写入sqlite 结束