FreeRTOS + STM32 HDL 串口通讯 定长 不定长数据

通过STM32CubeMX可以很容易的搭建起FreeRTOS+串口中断的平台。搭建完平台后,我们需要实现串口接收中断回调函数,如下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { HAL_UART_Receive_IT(&huart1,ReceBuffer,100); } }

虽然使用了HAL_UART_Receive_IT()接收定长数据函数,但是每接收一个字节都会进入串口中断。我们在这里置位一个接收数据的状态,以及记录此数据的接收时间,用于判断接收是否停止,便于接收不定长数据。 void USART1_IRQHandler() { //taskENTER_CRITICAL(); HAL_UART_IRQHandler(&huart1); ReceStatus = 1; ReceTime = osKernelSysTick(); //taskEXIT_CRITICAL(); }

在任务里我们就通过ReceStatus 和 实时时间来判断有没有接收到数据及数据是否停止,同时打印出来。

void StartTask2(void const * argument) { /* USER CODE BEGIN StartTask2 */ /* Infinite loop */ for(;;) { if(ReceStatus == 0) { printf("Hello,World! "); } else { if((ReceTime + 1000)<osKernelSysTick())//通过与系统时间的比对,判断接收是否停止 { HAL_UART_Transmit(&huart1,ReceBuffer,huart1.pRxBuffPtr-ReceBuffer,0xFFFF); ReceStatus = 0; HAL_UART_Receive_IT(&huart1,ReceBuffer,100); UART_Start_Receive_IT(&huart1,ReceBuffer,100); } else { printf("Receive New Data! "); } } osDelay(1000); } /* USER CODE END StartTask2 */ }

此程序应用了HDL库已经很完善的接收函数。通过huart1.pRxBuffPtr-ReceBuffer计算出接收的数量。通过UART_Start_Receive_IT(&huart1,ReceBuffer,100);重新开始接收新一帧数据。

不会发帖,希望能帮到有用的人!

经验分享 程序员 微信小程序 职场和发展