Hal库串口中断接收
当 RXbuff
的大小为1024字节,并且使用 HAL_UART_Receive_IT
进行中断接收时,STM32 HAL 库会根据配置在接收到一半数据(512字节)和全部数据(1024字节)时调用相应的回调函数。具体来说,以下是如何工作的:
工作原理
-
启动接收:
- 调用
HAL_UART_Receive_IT(&huartx, RXbuff, sizeof(RXbuff))
启动接收操作。 - 此函数立即返回
HAL_OK
,表示接收操作已经启动,但它不会等待所有数据都接收到。
- 调用
-
中断处理:
- 每次接收到一个字节的数据时,UART 接收中断就会被触发。
- 中断服务例程 (ISR) 会将接收到的数据存储到
RXbuff
中,并根据当前接收状态调用相应的回调函数。
-
回调函数:
- 当接收到一半数据(即512字节)时,
UART_RxHalfCpltCallback
回调函数会被调用。 - 当接收到全部数据(即1024字节)时,
UART_RxCpltCallback
回调函数会被调用。
- 当接收到一半数据(即512字节)时,
示例代码
以下是更详细的示例代码,展示了如何处理接收到的数据:
c
深色版本
#include "stm32fxxx_hal.h" // 根据您的具体MCU型号替换xxx
#define BUFFER_SIZE 1024
// 定义接收缓冲区
uint8_t RXbuff[BUFFER_SIZE];
volatile uint16_t rx_count = 0; // 用于跟踪接收到的字节数
extern UART_HandleTypeDef huartx;
// 中断回调函数:当接收到一半数据时调用
void UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USARTx) { // 根据实际使用的USART外设修改
printf("Received half of the data (512 bytes).\n");
// 处理前半部分数据
// ...
rx_count += BUFFER_SIZE / 2;
}
}
// 中断回调函数:当接收到全部数据时调用
void UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USARTx) { // 根据实际使用的USART外设修改
printf("Received all data (1024 bytes).\n");
// 处理全部数据
// ...
rx_count += BUFFER_SIZE / 2;
// 如果需要继续接收,可以重新启动接收
HAL_UART_Receive_IT(&huartx, RXbuff, BUFFER_SIZE);
}
}
// 主函数中启动接收
int main(void) {
// 初始化HAL库、时钟、GPIO等
HAL_Init();
SystemClock_Config(); // 配置系统时钟
MX_USARTx_UART_Init(); // 初始化串口,根据实际配置修改
// 启动中断接收
if (HAL_UART_Receive_IT(&huartx, RXbuff, BUFFER_SIZE) != HAL_OK) {
// 错误处理
printf("Failed to start UART receive IT.\n");
}
while (1) {
// 主循环
// 可以在这里添加其他任务
}
}
关键点说明
HAL_UART_Receive_IT
:启动中断接收后立即返回,不会等待接收完成。- 回调函数:当接收到一半或全部数据时,回调函数会被调用。您可以在这些函数中处理接收到的数据。
rx_count
:使用一个全局变量来跟踪接收到的字节数,确保知道何时接收完成。- 重新启动接收:在
UART_RxCpltCallback
中,如果需要继续接收数据,可以重新调用HAL_UART_Receive_IT
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!