发 帖  
原厂入驻New

[经验] 串口接收不定长数据

2019-8-1 09:14:52  938 STM32 串口
分享
2
串口接收不定长数据程序(适合没有空闲中断的单片机),采用的是定时器判断是否接收结束,程序在STM32F4探索者上测试发送间隔50ms以上不会出现粘包现象,20ms偶尔会出现粘包现象。
typedef struct
{
        uint8_t Rec_Flag;
        uint8_t Process;
        uint8_t timeout;/* 单位ms */
        uint8_t Rx_Length;
        uint8_t Tx_Buf[64];
        uint8_t Rx_Buf[64];
}USART_RTx_TypeDef;

extern USART_RTx_TypeDef USART2_RTx;


void USART2_IRQHandler(void)
{
  IF(LL_USART_IsActiveFlag_RXNE(USART2) != RESET)
  {
    USART2_RTx.Rx_Buf[USART2_RTx.Rx_Length++]=USART2->DR;
    switch(USART2_RTx.Process)
    {
      case 0:
        USART2_RTx.Timeout=3;
        USART2_RTx.Process=1;
        LL_TIM_EnableCounter(TIM1);
        break;
      case 1:
        USART2_RTx.Timeout=3;
        break;
      default:
        USART2_RTx.Timeout=0;
        USART2_RTx.Process=0;
        LL_TIM_DisableCounter(TIM1);
        break;
    }
  }
}


void TIM1_UP_TIM10_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
  if(LL_TIM_IsActiveFlag_UPDATE(TIM1) != RESET)
  {
    LL_TIM_CleaRFlag_UPDATE(TIM1);
    USART2_RTx.Timeout--;
    if(USART2_RTx.Timeout == 0)
    {
      USART2_RTx.Rec_Flag=1;/* 接收完成标志 */
      LL_TIM_DisableCounter(TIM1);
      USART2_RTx.Process=0;
    }
  }
}

相关经验

不知道有没有效果更好的程序
回复

举报

阿信509 2019-8-1 09:45:43
不是应该用串口中断吗?为啥要定时呢
回复

举报

为了让生活美好 2019-8-1 15:24:44
是使用串口中断呀!定时是为了接收不定长数据。
回复

举报

迅得电子 2019-8-5 15:55:48
程序效果不怎么好?
1回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

    快速回复 返回顶部 返回列表