使用中断方式接收数据
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);参数huart:串口句柄的指针,比如&huart1参数pData:接收数据缓冲区参数Size:要接收数据的量
回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);参数huart:串口句柄的指针,比如&huart1
示例:串口接收数据控制LED闪烁频率
声明变量
1234567 | /* Private variables ---------------------------------------------------------*/UART_HandleTypeDef huart1;//串口的句柄 /* USER CODE BEGIN PV */static uint32_t blinkInterval = 1000;//闪灯频率变量static uint8_t dataRcvd;//声明接收数据变量/* USER CODE END PV */ |
回调函数,进行数据处理,并再次调用HAL_UART_Receive_IT函数接收下一字节数据。
123456789101112131415161718192021 | /* USER CODE BEGIN 0 */void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart == &huart1)//确认接收数据的串口时huart1 { if(dataRcvd == '1') { blinkInterval = 1000; } if(dataRcvd == '2') { blinkInterval = 300; } if(dataRcvd == '3') { blinkInterval = 50; } HAL_UART_Receive_IT(&huart1, &dataRcvd, 1);//为下一次接收准备 }}/* USER CODE END 0 */ |
main
12345678910111213 | /* USER CODE BEGIN WHILE */ HAL_UART_Receive_IT(&huart1, &dataRcvd, 1);//开启USART1的中断接收模式,串口1接收到1字节的数据时,保存在dataRcvd变量中 while (1) { HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET); HAL_Delay(blinkInterval); HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET); HAL_Delay(blinkInterval); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ |