Skip to main content
Visitor II
September 12, 2024
Question

UART_WaitOnFlagUntilTimeout

  • September 12, 2024
  • 1 reply
  • 1882 views

i was debugging code HAL_uart_Receive ();

 sprintf(command, "AT+CMGL=\"ALL\"\r\n");//read all sms
 		 HAL_UART_Transmit(&huart1, (uint8_t *)command, strlen(command), 10);
// 		 HAL_Delay(100);
 		 HAL_UART_Receive(&huart1, RXbuffer, sizeof(RXbuffer), HAL_MAX_DELAY);

 i jump suddenly in here

/**
 * @brief This function handles UART Communication Timeout. It waits
 * until a flag is no longer in the specified status.
 * @PAram huart Pointer to a UART_HandleTypeDef structure that contains
 * the configuration information for the specified UART module.
 * @PAram Flag specifies the UART flag to check.
 * @PAram Status The actual Flag status (SET or RESET).
 * @PAram Tickstart Tick start value
 * @PAram Timeout Timeout duration
 * @retval HAL status
 */
static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status,
 uint32_t Tickstart, uint32_t Timeout)
{
 /* Wait until flag is set */
 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))
 {

 return HAL_TIMEOUT;
 }

 if ((READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) && (Flag != UART_FLAG_TXE) && (Flag != UART_FLAG_TC))
 {
 if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) == SET)
 {
 /* Clear Overrun Error flag*/
 __HAL_UART_CLEAR_OREFLAG(huart);

 /* Blocking error : transfer is aborted
 Set the UART state ready to be able to start again the process,
 Disable Rx Interrupts if ongoing */
 UART_EndRxTransfer(huart);

 huart->ErrorCode = HAL_UART_ERROR_ORE;

 /* Process Unlocked */
 __HAL_UNLOCK(huart);

 return HAL_ERROR;
 }
 }
 }
 }
 return HAL_OK;
}


how to solve this problem?

    This topic has been closed for replies.

    1 reply

    Graduate II
    September 12, 2024

    That's not a problem because that's what you've instructed the HAL driver to do.

    You've used HAL_MAX_DELAY which is waiting for ~49 days before it returns from the timeout or you've received the correct amount of bytes.

    Replace HAL_MAX_DELAY to something like 100, which will return after 100ms timeout. 

    Visitor II
    September 13, 2024

    Still same problem

    Graduate II
    September 13, 2024

    It's supposed to go to that function. So you need to explain in more detail what YOU think is the problem.