STM32 HAL库函数——HAL_UART_RxCpltCallback()详解

这篇具有很好参考价值的文章主要介绍了STM32 HAL库函数——HAL_UART_RxCpltCallback()详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

他是谁,他和谁有关

HAL_UART_RxCpltCallback 是一个回调函数,用于在使用 HAL 库进行串口接收时处理接收完成事件。当使用 HAL_UART_Receive_IT 函数启动串口接收并且接收到指定数量的数据后,HAL 库会自动调用 HAL_UART_RxCpltCallback 函数。

回调函数是一种特殊的函数,它在特定事件发生时由系统或库调用,而不是由程序显式调用。在这种情况下,当串口接收完成时,HAL 库会自动调用 HAL_UART_RxCpltCallback 函数。

调用机制如下:

  1. 首先,您需要在您的代码中定义一个名为 HAL_UART_RxCpltCallback 的函数,并将其放在合适的位置。例如,您可以将其放在主文件中或者在一个单独的回调文件中。

  2. 当使用 HAL_UART_Receive_IT 函数启动串口接收时,HAL 库会在接收完成时触发一个中断。

  3. 中断发生后,系统会暂停当前正在执行的任务,并转而执行中断服务程序(ISR)。

  4. 在 ISR 中,HAL 库会检测到串口接收完成中断,并调用 HAL_UART_RxCpltCallback 函数。

  5. HAL_UART_RxCpltCallback 函数中,您可以编写处理接收完成事件的代码。例如,您可以在该函数中读取接收到的数据并进行处理,或者设置标志位以通知主程序接收已完成。

需要注意的是,为了正确使用回调函数,您需要在初始化串口时启用中断模式,并确保正确配置中断优先级。此外,还需要为 HAL_UART_RxCpltCallback 函数提供正确的函数原型,以便 HAL 库可以正确地调用它。

功能用法

HAL_UART_RxCpltCallback 是在使用STM32 HAL库时,用于处理UART接收完成中断的回调函数。当使用 HAL_UART_Receive_IT 函数启动UART接收中断后,每当接收到一个字符时,该回调函数就会被调用一次。

以下是关于 HAL_UART_RxCpltCallback 的一些详细说明:

功能:

  • HAL_UART_RxCpltCallback 函数用于处理UART接收完成中断。它是一个用户定义的函数,当接收到一个字符时,HAL库会自动调用该函数。

用法:

  1. 在你的代码中定义一个名为 HAL_UART_RxCpltCallback 的函数,函数的原型应该与 UART_HandleTypeDef 结构体中定义的回调函数指针一致。例如:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    // 在这里处理接收到的数据
}
  1. main 函数中启用UART接收中断,可以使用 HAL_UART_Receive_IT 函数。例如:
HAL_UART_Receive_IT(&huart1, &rx_data, 1);
  1. 当接收到一个字符时,HAL_UART_RxCpltCallback 函数就会被自动调用。

注意事项:

  • HAL_UART_RxCpltCallback 函数是在中断上下文中执行的,因此应该尽量保持它的执行时间短,避免执行耗时操作。
  • 如果你希望处理多个字符,而不仅仅是一个字符,你可以在 HAL_UART_RxCpltCallback 函数中使用循环来处理多个接收到的字符。
  • 确保接收缓冲区足够大以容纳所有接收到的字符,并进行边界检查,以防止数据溢出。

每收到一个字符,就自动调用一次??

比如,通过串口接收到了十个字符,但是HAL_UART_RxCpltCallback回调里面每次只处理1个字符,那么会调用HAL_UART_RxCpltCallback十次嘛?

是的,如果您在 HAL_UART_RxCpltCallback 回调函数中每次只处理一个字符,那么在接收到十个字符时,该回调函数将被调用十次。

当使用 HAL_UART_Receive_IT 函数启动串口接收时,HAL 库会在每接收到一个字符时触发一次接收完成中断。每次中断发生时,系统将调用 HAL_UART_RxCpltCallback 回调函数。

因此,如果您在回调函数中只处理一个字符,那么在接收到十个字符时,该函数将被调用十次,每次处理一个字符。

如果您希望一次性处理所有接收到的字符,而不是逐个处理,可以在回调函数中使用循环来处理接收到的数据。例如,您可以使用一个缓冲区数组,在回调函数中将接收到的字符存储在数组中,然后在接收完成后一次性处理整个数组。

请注意,在处理多个字符时,您需要确保缓冲区足够大以容纳所有接收到的字符,并且在存储字符之前进行必要的边界检查,以防止溢出或访问无效内存。

示例----接收未知长度的字符

如果我们提前不知道要接收的字符串的长度是多少,那么该如何接收该字符串呢?接收完成后确认收到的字符串是不是“OK”;
下面是一个完整的示例,演示了如上要求的功能,且演示了如何在中断处理函数中循环接收字符,直到接收到预定的字符串。

#include "stm32g0xx_hal.h"

#define BUFFER_SIZE 100

UART_HandleTypeDef huart1;
uint8_t rxBuffer[BUFFER_SIZE];
uint8_t receivedString[] = "OK";
uint8_t receivedIndex = 0;
uint8_t stringMatched = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if (huart == &huart1)
  {
    if (rxBuffer[receivedIndex] == receivedString[receivedIndex])
    {
      receivedIndex++;
      if (receivedIndex == sizeof(receivedString) - 1)
      {
        stringMatched = 1;
      }
    }
    else
    {
      receivedIndex = 0;
    }

    HAL_UART_Receive_IT(&huart1, &rxBuffer[receivedIndex], 1);
  }
}

int main(void)
{
  HAL_Init();
  // 初始化串口和其他相关配置

  HAL_UART_Receive_IT(&huart1, &rxBuffer[receivedIndex], 1);

  while (1)
  {
    if (stringMatched)
    {
      // 接收到了预定的字符串 "OK"
      // 执行相应的操作
      stringMatched = 0;
      receivedIndex = 0;
    }

    // 执行其他任务
  }
}

在这个示例中,我们定义了一个接收缓冲区 rxBuffer,用于存储接收到的字符。我们还定义了一个预定的字符串 receivedString,这里假设为 “OK”。receivedIndex 用于跟踪接收到的字符的索引,stringMatched 用于指示是否接收到了完整的预定字符串。

HAL_UART_RxCpltCallback 中断处理函数中,我们首先检查接收到的字符是否与预定字符串的当前字符匹配。如果匹配,我们递增 receivedIndex。如果 receivedIndex 达到预定字符串的长度减一(因为字符串以 null 结尾),则表示接收到了完整的预定字符串,将 stringMatched 设置为 1。

如果接收到的字符与预定字符串的当前字符不匹配,我们将 receivedIndex 重置为 0,以重新开始匹配过程。

最后,我们调用 HAL_UART_Receive_IT 函数,传入接收缓冲区的下一个位置 &rxBuffer[receivedIndex],以便继续接收下一个字符。

在主循环中,我们检查 stringMatched 的值。如果为 1,表示接收到了完整的预定字符串,我们可以执行相应的操作,并将 stringMatchedreceivedIndex 重置为 0。文章来源地址https://www.toymoban.com/news/detail-635506.html

到了这里,关于STM32 HAL库函数——HAL_UART_RxCpltCallback()详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解

    Author: DrinkCat(szt@drinkcat.com) Copyright © 2023 DrinkCat Original link: DrinkCat’s Blog UART是一种异步串行通信接口,常用于通过串口与外部设备进行通信。它通过发送和接收数据帧来实现数据传输,使用起来相对简单。UART通常包含发送器(Transmitter)和接收器(Receiver),通过两根信号线

    2024年02月10日
    浏览(40)
  • STM32 HAL库的串口中断服务函数详解

    最近在实现利用上位机通过串口发送指令给下位机执行操作的实验,在之前学习串口的过程中我就一直有一个疑惑,那就是为什么在串口中断回调函数内除了要加上自己的操作以外还要在末尾再执行一次 接收中断 ,在查阅了一些资料后我才发现原来和 中断服务函数 有关 我

    2024年02月10日
    浏览(43)
  • STM32 HAL库 STM32CubeMx -- 串口的使用(USART/UART)

    在上一篇博客里面写了串口通信的理论知识,在这一篇中将讲述串口通信在STM32CubeMx里面的配置,以及在函数里面怎么使用。 对于串口发送信息,分为三种方法: 串口阻塞方式收发 、 串口中断方式收发 、 串口DMA方式收发 。(DMA方式在之后的DMA章节讲解) 关于STM32CubeMx的基

    2024年02月06日
    浏览(74)
  • stm32 笔记 UART读取及HAL库应用

     由此图可知: 采用HAL库,中断方式接收串口,只有当RxXferCount == 0 时,也就是调用这个函数,接收指定量的数据大小完成时,才会调用回调函数HAL_UART_RxCpltCallback()。 而且,RxXferCount == 0 后,也会使得中断退出,此时需要从新设置 HAL_UART_Receive_IT() 开启中断。 这里还需要注意

    2024年02月15日
    浏览(49)
  • STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解

    以STM32G030C8T6中的HAL_TIM_Base_Start_IT()函数为例,进行解释; 函数原型: 函数原型: 该函数用于 启动定时器的中断模式 。在使用该函数之前,需要先初始化好定时器的配置,并将相关的中断处理函数注册到对应的中断向量中。 htim:指向TIM_HandleTypeDef结构体的指针,包含了定时

    2024年02月04日
    浏览(37)
  • [015] [STM32] IIC协议详解与HAL库相关函数分析

    IIC(Inter Integrated Circuit)总线在物理层由SDA(Serial data, 串行数据线)、SCL(Serial clock line,串行时钟线)和上拉电阻组成。 每个连接到总线的设备都 有一个独立的地址 ,主机可以利用此地址进行不同设备之间的访问 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 为了避

    2023年04月08日
    浏览(34)
  • STM32-UART-DMA HAL库缓冲收发

    1.1、注意事项: HAL库的DMA底层基本都会默认开启中断使能,如果在STM32CubeMx禁用了中断相关的功能,程序可能会进入空中断回调出不来。 切记使用STM32-HAL库的DMA发送时需要开启USART中断和DMA中断。 在一般时间要求不是很高很高的场合,使用HAL库自带的函数就可以,并不会很频

    2024年01月18日
    浏览(46)
  • STM32 HAL库的HAL_UART_Transmit_IT使用方法

    是STM32 HAL库中非阻塞的串口发送函数。 用法:1. 调用HAL_UART_Transmit_IT()发送数据            2. 在HAL_UART_TxCpltCallback()里写上发送完成后的处理 注意: HAL_UART_Transmit_IT()要等待上次发送完成后再发送,否则返回HAL_BUSY。用huart-gState == HAL_UART_STATE_READY判断上次是否发送完成。 官方

    2024年02月16日
    浏览(39)
  • STM32学习笔记-SMT32使用HAL库UART中断方式使用

    目录 1、引言 2、配置 3、流程 近来需要使用蓝牙模块,再了解到蓝牙模块等无线模块许多使用串口透传,便决定在研究一下串口UART 的使用方法。 由于用的板子种类每次都不一样,有F103 有G0 有G4 还有公司的8位自研芯片,所以每次用起来都需要重头开始复习 每次使用UART的目

    2023年04月12日
    浏览(51)
  • Stm32 HAL_UART_Receive读取不到数据的问题

    最近在做Stm32方面的工作时发现使用HAL_UART_Receive函数去读取数据时出现了问题,代码如下:  这段代码非常简单,就是在一定时间内读取满128个字符,但是会有一个问题,如果超时时buffer没有被读取到128个字节那么下次还可以读取,但是一旦超出或到达128个字节下次在读取就

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包