su-409464 发表于 2016-7-8 17:31:21

关于 HAL 库中 串口的参数 疑问

请问大家 HAL库中, 串口的Timeout 参数 具体代表什么意思如何使用

1. HAL_StatusTypeDef HAL_USART_Receive (USART_HandleTypeDef * husart, uint8_t * pRxData, uint16_t Size, uint32_t Timeout)

Timeout是超时限制 这个可以理解,但是 问题是 它的单位是多少????

比如填个1    代表1 什么?1ms还是1 us ?

另外填0 呢?不限时,填 ffff 呢??

看了 HAL 的手册 都没有说清楚:




Paderboy 发表于 2016-7-8 18:01:29

本帖最后由 Paderboy 于 2016-7-8 18:06 编辑

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
uint16_t* tmp;
uint16_t uhMask;

if((huart->State == HAL_UART_STATE_READY) || (huart->State == HAL_UART_STATE_BUSY_TX))
{
    if((pData == NULL ) || (Size == 0))
    {
      returnHAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart->ErrorCode = HAL_UART_ERROR_NONE;
    /* Check if a non-blocking transmit process is ongoing or not */
    if(huart->State == HAL_UART_STATE_BUSY_TX)
    {
      huart->State = HAL_UART_STATE_BUSY_TX_RX;
    }
    else
    {
      huart->State = HAL_UART_STATE_BUSY_RX;
    }

    huart->RxXferSize = Size;
    huart->RxXferCount = Size;

    /* Computation of UART mask to apply to RDR register */
    UART_MASK_COMPUTATION(huart);
    uhMask = huart->Mask;

    /* as long as data have to be received */
    while(huart->RxXferCount > 0)
    {
      huart->RxXferCount--;
      if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout)!= HAL_OK)
      {
      return HAL_TIMEOUT;
      }
      if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
      {
      tmp = (uint16_t*) pData ;
      *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
      pData +=2;
      }
      else
      {
      *pData++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
      }
    }

    /* Check if a non-blocking transmit Process is ongoing or not */
    if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
    {
      huart->State = HAL_UART_STATE_BUSY_TX;
    }
    else
    {
      huart->State = HAL_UART_STATE_READY;
    }
    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    return HAL_OK;
}
else
{
    return HAL_BUSY;
}
}HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Timeout)
{
uint32_t tickstart =HAL_GetTick();

/* Wait until flag is set */
if(Status == RESET)
{
    while(__HAL_UART_GET_FLAG(huart, Flag) == RESET)
    {
      /* Check for the Timeout */
      if(Timeout != HAL_MAX_DELAY)
      {
      if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
      {
          /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
          __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
          __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
          __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
          __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

          huart->State = HAL_UART_STATE_READY;

          /* Process Unlocked */
          __HAL_UNLOCK(huart);

          return HAL_TIMEOUT;
      }
      }
    }
}
else
{
    while(__HAL_UART_GET_FLAG(huart, Flag) != RESET)
    {
      /* Check for the Timeout */
      if(Timeout != HAL_MAX_DELAY)
      {
      if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
      {
          /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
          __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
          __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
          __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
          __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);

          huart->State = HAL_UART_STATE_READY;

          /* Process Unlocked */
          __HAL_UNLOCK(huart);

          return HAL_TIMEOUT;
      }
      }
    }
}
return HAL_OK;
}你自己再好好分析下。。 确实HAL库的说明太过于简单了。。。 还得靠你自己。。摸索。。

UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout)

HAL_GetTick();






su-409464 发表于 2016-7-9 09:36:58

Paderboy 发表于 2016-7-8 18:01
你自己再好好分析下。。 确实HAL库的说明太过于简单了。。。 还得靠你自己。。摸索。。

UART_ ...

谢谢你, 这个我已经找到 了 ,而且我知道

/**
* @brief uwTick_variable uwTick variable
*/
__IO uint32_t uwTick;

/**
* @brief Provides a tick value in millisecond.
* @note This function is declared as __weak to be overwritten in case of other
*       implementations in user file.
* @retval tick value
*/
__weak uint32_t HAL_GetTick(void)
{
return uwTick;
}


但具体 uwTick 单位是什么呢???

Paderboy 发表于 2016-7-9 15:39:03

Tick 就是ms为单位的。。

asssdz-382474 发表于 2016-7-9 21:30:08

签到签到

北国牧马 发表于 2016-7-11 14:19:39

HAL_GetTick();基于这个函数计时来比较是否超时,而HAL_GetTick()计数单位为ms,所以就是ms了。至于填多少,就得看你的波特率,接收发送数据大小大致估算下时间。

eefishing 发表于 2016-7-16 23:04:24

楼主问题解决了吗

su-409464 发表于 2016-7-18 16:43:56

eefishing 发表于 2016-7-16 23:04
楼主问题解决了吗

可以参考 楼上的!!

1ms!!!
页: [1]
查看完整版本: 关于 HAL 库中 串口的参数 疑问