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

该博客介绍了如何使用STM32CubeMX和FreeRTOS实现串口中断接收,并处理定长和不定长数据。通过HAL_UART_RxCpltCallback回调函数接收数据,并在USART1_IRQHandler中断中设置接收状态和时间记录。在任务StartTask2中,根据接收状态和时间判断数据接收是否完成,并进行相应处理。利用huart1.pRxBuffPtr-ReceBuffer计算已接收数据量,使用UART_Start_Receive_IT重新启动接收新数据。

通过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);重新开始接收新一帧数据。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值