STM32
直播中

xymbmcu

12年用户 1067经验值
擅长:可编程逻辑
私信 关注
[问答]

串口接收超时判断,采用HAL_USART_Receive还是HAL_USART_Receive_IT呢?

串口接收超时判断问题

方法一:
HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t timeout)

自带Timeout ,方便好用(设定systick ,每1ms中断 ),处理器每1ms检查寄存器标记及超时。
....
while(__HAL_USART_GET_FLAG(husart, Flag) == RESET)
    {
      /* Check for the Timeout */
      if(Timeout != HAL_MAX_DELAY)
      {
        if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
        {
....


方法二:
HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)

在中断中设定接收完成标记,主循环中检查超时,处理器每1ms检查收完成标记及超时;每次中断接收后,还要重新启动中断。


即使在多任务中,处理器在每1ms检查过程中,可以做其他事情。

采用中断的方式好像没有什么优势??
大家有什么看法

回帖(1)

石玉兰

2024-4-26 17:06:35
在串口接收超时判断的问题上,我们可以选择使用HAL_USART_Receive或HAL_USART_Receive_IT。这两种方法各有优缺点,具体选择哪一种取决于项目需求和硬件配置。

1. HAL_USART_Receive:
这个方法是一个阻塞式的方法,它在接收到数据之前会一直等待。它自带一个超时参数(Timeout),可以在接收过程中设置一个超时时间。当超时时间到达时,如果还没有接收到数据,函数会返回一个错误码。这种方法的优点是简单易用,适合对实时性要求不高的场景。但是,由于它是阻塞式的,可能会影响其他任务的执行。

2. HAL_USART_Receive_IT:
这个方法是一个非阻塞式的方法,它使用中断来接收数据。当接收到数据时,会触发一个中断,然后在中断服务程序中处理数据。这种方法的优点是非阻塞,不会影响其他任务的执行。但是,它的实现相对复杂,需要编写中断服务程序。

关于串口接收超时判断问题的方法一,使用HAL_USART_Receive并设置Timeout参数是一个可行的方案。以下是实现步骤:

1. 定义一个超时变量(例如:uint32_t Timeout)。
2. 调用HAL_USART_Receive函数,传入USART句柄、接收缓冲区、数据大小和超时时间。
3. 在一个循环中,检查接收标志(例如:__HAL_USART_GET_FLAG(husart, USART_FLAG_RXNE))是否被设置。如果没有被设置,说明还没有接收到数据。
4. 在循环中,检查是否已经超时。如果超时,跳出循环并处理超时情况。
5. 如果接收标志被设置,说明已经接收到数据,可以继续处理接收到的数据。

这种方法的优点是简单易用,但需要注意的是,由于它是阻塞式的,可能会影响其他任务的执行。如果项目中对实时性要求较高,可以考虑使用HAL_USART_Receive_IT方法,通过中断来接收数据,以提高实时性。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分