STM32G4HAL库-串口空闲中断接收不定长数据完整代码
时间: 2023-08-07 11:02:54 浏览: 261
好的,以下是一个完整的使用STM32G4HAL库实现串口空闲中断接收不定长数据的代码,供您参考:
首先,需要在CubeMX中配置串口和中断。在串口配置中,需要开启空闲中断,并设置接收缓冲区大小。在中断配置中,需要开启串口空闲中断,并设置中断优先级。
接下来是代码实现:
```c
#include "main.h"
#include "stm32g4xx_hal.h"
#define RX_BUF_SIZE 64 // 接收缓冲区大小
UART_HandleTypeDef huart2;
uint8_t rx_buf[RX_BUF_SIZE]; // 接收缓冲区
uint8_t rx_len = 0; // 接收数据长度
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2) // 判断是哪个串口触发的中断
{
if(rx_len < RX_BUF_SIZE) // 判断是否超出接收缓冲区大小
{
rx_buf[rx_len++] = (uint8_t)(huart->Instance->RDR & 0xFF); // 读取接收数据
}
else
{
rx_len = 0; // 超出接收缓冲区大小,清空缓冲区
}
}
HAL_UART_Receive_IT(&huart2, (uint8_t *)&rx_buf[rx_len], 1); // 重新开启接收中断
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
HAL_UART_Receive_IT(&huart2, (uint8_t *)&rx_buf[rx_len], 1); // 开启接收中断
while (1)
{
if(rx_len > 0) // 判断是否接收到数据
{
// 处理接收到的数据,例如打印到串口或处理指令等操作
HAL_UART_Transmit(&huart2, rx_buf, rx_len, HAL_MAX_DELAY); // 回传接收到的数据
rx_len = 0; // 清空接收缓冲区
HAL_UART_Receive_IT(&huart2, (uint8_t *)&rx_buf[rx_len], 1); // 重新开启接收中断
}
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 4;
RCC_OscInitStruct.PLL.PLLN = 32;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
Error_Handler();
}
}
```
代码中使用了串口空闲中断,当接收到完整的数据包后会触发中断,然后在中断回调函数中读取接收缓冲区的数据并清空缓冲区,同时重新开启接收中断。在主循环中判断接收缓冲区是否有数据,如果有则进行处理,例如将数据回传到串口或进行其他操作。
阅读全文