如何接收串口数据_串口接收不定长数据

本文介绍了如何在STM32F4探索者板上实现串口接收不定长数据,利用定时器判断接收结束,确保在50ms以上的发送间隔下避免粘包问题。虽然20ms时可能出现粘包,但整体方案对于没有空闲中断的单片机具有参考价值。
摘要由CSDN通过智能技术生成

  串口接收不定长数据程序(适合没有空闲中断的单片机),采用的是定时器判断是否接收结束,程序在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;
    }
  }
}

http://www.makeru.com.cn/live/1392_1164.html?s=45051

最后依然为大家提供一些资料,希望在某种程度上帮到大家

- STM32 USART串口的应用 -

- 基于STM32讲解串口操作 -

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值