通过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!\r\n"); ?? ??? ?} ?? ??? ?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!\r\n"); ?? ??? ??? ?} ?? ??? ?} ? ? osDelay(1000); ? } ? /* USER CODE END StartTask2 */ }
此程序应用了HDL库已经很完善的接收函数。通过huart1.pRxBuffPtr-ReceBuffer计算出接收的数量。通过UART_Start_Receive_IT(&huart1,ReceBuffer,100);重新开始接收新一帧数据。
不会发帖,希望能帮到有用的人!
|