定时器串口不定长接收

文章描述了一种使用定时器在72MHz频率下配置为5ms中断的方法,用于处理串口接收。在串口接收到数据时启动定时器,5ms后关闭并设置标志位。当标志位为1时,表明接收完成。这种方法可能存在数据帧对齐问题,但在发送端增加延时可改善。
摘要由CSDN通过智能技术生成

首先配置定时器计数时长(串口接收时间)

本次配置为5ms(72MHz频率下  配置为PSC=72  ARR=5000)

串口和定时器均需要打开中断 可配置相同中断优先级

编写串口接收回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

        __HAL_TIM_SET_COUNTER(&htim3,0);
        if(0 == rs485i.Rx_cnt)
        {
            __HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
            HAL_TIM_Base_Start_IT(&htim3);
        }
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);
        rs485i.Rx_Buf[rs485i.Rx_cnt] = rs485i.Rx_temp[0];
        rs485i.Rx_cnt++;
        HAL_UART_Receive_IT(&huart1,rs485i.Rx_temp,REC_LENGTH);

}

编写定时器中断函数:

  if (htim->Instance == TIM3) {
     rs485i.Rx_flg = 1;
      HAL_TIM_Base_Stop_IT(&htim3);
  }

当串口接收到第一帧数据时打开定时器 计时5ms后关闭定时器 并将接受标志位置1 

在主函数中判断标志位为1时需要做的事情 并将标志位清0

此方法缺点为5ms后数据起始位可能不是正确的数据帧第一位 造成接收多次才能收到正确数据帧 

当发送端增加延时发送时可以解决此问题 但程序会变阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值