无网站网络营销凡客诚品vancl
news/
2025/9/26 10:38:58/
文章来源:
无网站网络营销,凡客诚品vancl,蛋糕电子商务网站建设方案,黑龙江省公开招标信息网本文为大家介绍如何使用 串口 接收定长 和 不定长 的数据。 文章目录 前言一、串口接收定长数据1. 函数介绍2.代码实现 二、串口接收不定长数据1.函数介绍2. 代码实现 三#xff0c;两者回调函数的区别比较四#xff0c;空闲中断的介绍总结 前言
一、串口接收定长数据
1. 函… 本文为大家介绍如何使用 串口 接收定长 和 不定长 的数据。 文章目录 前言一、串口接收定长数据1. 函数介绍2.代码实现 二、串口接收不定长数据1.函数介绍2. 代码实现 三两者回调函数的区别比较四空闲中断的介绍总结 前言
一、串口接收定长数据
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 缓冲区中。
串口接收完成回调函数
// 当串口接收到数据就调用该回调函数
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.函数介绍
开启串口空闲接收中断
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);参数
huartUART 句柄指向正在使用的串口设备。pData存储接收数据的缓冲区的指针。Size期望接收的数据字节数。
串口接收事件回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{}参数
huartUART 句柄指向正在使用的串口设备。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 检测到通信线路处于空闲状态时且空闲状态持续时间大于一个字节传输时间时将会触发空闲中断 。空闲中断的触发通常表示一次完整的数据传输已经结束。
当 产生空闲中断后会调用 空闲中断的接收事件回调函数将接收到的数据全部打印出来这样就可以实现不定长数据的接收。
应用场景 串口通信中的数据帧解析 在串口通信中空闲中断常用于解析数据帧。一旦检测到空闲中断就可以确定一帧数据已经接收完整并开始解析其中的数据。 数据接收超时处理 空闲中断可以用于实现数据接收的超时处理。如果一定时间内未触发空闲中断可以认为数据接收超时并进行相应的处理例如丢弃接收缓冲区中的数据或发出超时警告。 多任务环境下的数据同步 在多任务系统中空闲中断可以用于实现任务之间的数据同步。当一个任务接收到完整的数据帧后可以通过触发空闲中断来通知其他任务进行相关操作或处理。
总之空闲中断在串口通信中具有重要的作用用于检测数据传输的完成和触发相应的处理操作适用于各种数据接收和处理场景。 总结
下一篇文章为大家介绍 串口 UART 协议.。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918123.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!