硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2138|回复: 6
收起左侧

[UART] 串口接收超时的问题,超时时间如何设置

[复制链接]

12

主题

68

回帖

104

积分

初级会员

积分
104
发表于 2022-3-3 17:46:55 | 显示全部楼层 |阅读模式


调用函数1:HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
这个函数,这个超时设置如何设置?
是不是需要接收的数据越多,超时设置就的越大?
超时函数时每次接收一个数据都会调用以下的函数:而下面的函数里的Tickstart参数是在进while循环的之前的,也就是说,接收的数据越多,HAL_GetTick() - Tickstart 这个值就越大
HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
                                              uint32_t Tickstart, uint32_t Timeout)


image.png

HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
                                              uint32_t Tickstart, uint32_t Timeout)
{
  /* Wait until flag is set */
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
        gTickstart = Tickstart;
  while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status)
  {
    /* Check for the Timeout */
               
    if (Timeout != HAL_MAX_DELAY)
    {
      if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
      {
                                gNTickstart = HAL_GetTick();
                               
        /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error)
           interrupts for the interrupt process */
        CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
        CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

        huart->gState = HAL_UART_STATE_READY;
        huart->RxState = HAL_UART_STATE_READY;

        __HAL_UNLOCK(huart);
                                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
        return HAL_TIMEOUT;
      }

      if (READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U)
      {
        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF) == SET)
        {
          /* Clear Receiver Timeout flag*/
          __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF);

          /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error)
             interrupts for the interrupt process */
          CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
          CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);

          huart->gState = HAL_UART_STATE_READY;
          huart->RxState = HAL_UART_STATE_READY;
          huart->ErrorCode = HAL_UART_ERROR_RTO;

          /* Process Unlocked */
          __HAL_UNLOCK(huart);

          return HAL_TIMEOUT;
        }
      }
    }
  }
        gNTickstart1 = HAL_GetTick();
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
  return HAL_OK;
}

image.png
image.png
回复

使用道具 举报

5

主题

14

回帖

29

积分

新手上路

积分
29
发表于 2022-3-3 20:38:37 | 显示全部楼层
意思是接收N个字节的数据,如果时间到了还没接收N个字节数据,就退出。可根据波特率算一下 大概可以用一个字节数据10个bit时间来算。这个是阻塞式的
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2022-3-4 10:52:36 | 显示全部楼层
dengjingg 发表于 2022-3-3 20:38
意思是接收N个字节的数据,如果时间到了还没接收N个字节数据,就退出。可根据波特率算一下 大概可以用一个 ...

嗯嗯,我的理解也是这样,就是如果接收数据的越多,这个超时时间需要设置的更长
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2022-3-4 13:21:54 | 显示全部楼层
区别的讲,有的协议约定了超时,比如2.5字节,有的约定的结束字符
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2022-3-4 14:26:05 | 显示全部楼层
weboser 发表于 2022-3-4 10:52
嗯嗯,我的理解也是这样,就是如果接收数据的越多,这个超时时间需要设置的更长

理解了一般,这个超时时间是函数调用以后开始算起的,不是接收到串口数据以后开始计算的,这个时间应该算多久还要看响应方处理数据要多久。比如对方处理数据花费了时间T,你还要把这部分的时间也考虑进去。
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2022-3-6 20:35:13 | 显示全部楼层
emwin 发表于 2022-3-4 13:21
区别的讲,有的协议约定了超时,比如2.5字节,有的约定的结束字符

我看有协议的是设置的硬件的超时,需要配置寄存器
回复

使用道具 举报

12

主题

68

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2022-3-6 20:37:42 | 显示全部楼层
旮旯旭 发表于 2022-3-4 14:26
理解了一般,这个超时时间是函数调用以后开始算起的,不是接收到串口数据以后开始计算的,这个时间应该算 ...

嗯嗯,是的,那感觉超时还是容易的,比如调用这个函数时我设置超时时间为100ms,而实际第一个数据发送的时间时在我调用接收函数后的第98ms,那就很容易超时吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 19:05 , Processed in 0.264630 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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