通过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);重新开始接收新一帧数据。
不会发帖,希望能帮到有用的人!
该博客介绍了如何使用STM32CubeMX和FreeRTOS实现串口中断接收,并处理定长和不定长数据。通过HAL_UART_RxCpltCallback回调函数接收数据,并在USART1_IRQHandler中断中设置接收状态和时间记录。在任务StartTask2中,根据接收状态和时间判断数据接收是否完成,并进行相应处理。利用huart1.pRxBuffPtr-ReceBuffer计算已接收数据量,使用UART_Start_Receive_IT重新启动接收新数据。
1万+

被折叠的 条评论
为什么被折叠?



