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

一、串口接收定长数据

在串口通信中,定长数据的接收通常是指在已知数据长度的情况下,通过串口接收指定数量的数据。以下是实现该功能的基本步骤和代码示例。

1. 函数介绍
  • HAL_UART_Receive_IT:此函数用于开启串口接收中断,当接收到指定数量的数据时,会自动触发回调函数。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

参数说明:

  • huart:指向UART_HandleTypeDef结构体的指针,标识UART外设实例。

  • pData:指向数据接收缓冲区的指针。

  • Size:要接收的数据字节数。

  • HAL_UART_RxCpltCallback:串口接收完成回调函数,每次接收到指定数量的数据后被调用。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
2. 代码实现
// 接收数据的缓冲区
uint8_t recv_buff[10]; // 假设我们接收10个字节的数据

// 开启串口接收中断
HAL_UART_Receive_IT(&huart1, recv_buff, sizeof(recv_buff));

// 串口接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART1) {
        // 处理接收到的数据
        for (int i = 0; i < sizeof(recv_buff); i++) {
            printf("Received: %c\n", recv_buff[i]);
        }
        // 再次开启串口接收中断,准备接收下一批数据
        HAL_UART_Receive_IT(&huart1, recv_buff, sizeof(recv_buff));
    }
}

二、串口接收不定长数据

不定长数据的接收通常涉及到对数据帧的识别和解析。在STM32中,可以通过空闲中断来实现对不定长数据的接收。

1. 函数介绍
  • HAL_UARTEx_ReceiveToIdle_IT:此函数用于开启串口空闲中断,当串口检测到空闲状态时,会自动触发回调函数。
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

参数说明:

  • huart:UART句柄,指向正在使用的串口设备。

  • pData:存储接收数据的缓冲区的指针。

  • Size:期望接收的数据字节数。

  • HAL_UARTEx_RxEventCallback:串口接收事件回调函数,当串口接收到特定事件时被调用。

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size);

参数说明:

  • huart:UART句柄,指向正在使用的串口设备。
  • Size:接收到的数据字节数。
2. 代码实现
uint8_t recv_buff[20] = {0}; // 定义一个长度为20的接收缓冲区

// 开启串口空闲中断
HAL_UARTEx_ReceiveToIdle_IT(&huart1, recv_buff, sizeof(recv_buff));

// 空闲中断时调用的回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {
    if (huart->Instance == USART1) {
        // 在接收到的数据末尾添加字符串结束符
        recv_buff[Size] = '\0';
        // 根据接收到的数据执行相应操作
        if (strcmp((char*)recv_buff, "LED ON") == 0) {
            printf("LED ON command received\n");
            // 执行LED开启操作
        } else if (strcmp((char*)recv_buff, "LED OFF") == 0) {
            printf("LED OFF command received\n");
            // 执行LED关闭操作
        }
        // 重新开启空闲接收中断,继续监听串口数据
        HAL_UARTEx_ReceiveToIdle_IT(&huart1, recv_buff, sizeof(recv_buff));
    }
}

三、回调函数的区别比较

  • HAL_UART_RxCpltCallback:标准的HAL库提供的串口接收完成回调函数,每次成功接收到指定数量的数据后被调用。
  • HAL_UARTEx_RxEventCallback:HAL扩展库提供的串口接收事件回调函数,可以在串口接收到特定事件时被调用,例如接收到空闲状态时触发。

四、空闲中断的介绍

空闲中断是在串口通信中,当数据传输结束后,通信线路维持高电平状态时触发的中断。这种中断通常表示一次完整的数据传输已经结束,可以用来识别数据帧的结束。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI_Guru人工智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值