anka120 发表于 2018-7-3 08:53:54

串口接收超时判断,采用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检查过程中,可以做其他事情。

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

电子星辰 发表于 2018-7-3 09:15:48

但是HAL_USART_Receive接收不到或接收不完整的频率很高

wenyangzeng 发表于 2018-7-3 09:24:34

中断方式可以迅速反应事件以便及时处理。特别是USART,可以减少通讯数据丢失

anka120 发表于 2018-7-3 09:33:02

wenyangzeng 发表于 2018-7-3 09:24
中断方式可以迅速反应事件以便及时处理。特别是USART,可以减少通讯数据丢失 ...

HAL_USART_Receive 本身存在通讯不稳定的问题?哥们使用真存在该问题?

anka120 发表于 2018-7-3 09:33:46

wenyangzeng 发表于 2018-7-3 09:24
中断方式可以迅速反应事件以便及时处理。特别是USART,可以减少通讯数据丢失 ...

HAL_USART_Receive 本身存在通讯不稳定的问题?哥们使用真存在该问题?

wenyangzeng 发表于 2018-7-3 09:52:31

anka120 发表于 2018-7-3 09:33
HAL_USART_Receive 本身存在通讯不稳定的问题?哥们使用真存在该问题?

HAL_USART_Receive 不存在通讯不稳定的问题,主要是采用中断方式时,可以在系统任务繁忙时能够及时接收USART数据。

anka120 发表于 2018-7-3 10:08:11

针对 超时判断的情况,如之前描述,没有发现方法一比方法二更加及时啊 :dizzy:

发表于 2018-7-3 14:32:43

看使用环境吧。我感觉两个都不是很好用。还是习惯使用之前的标准库,串口这里完全不用考虑接收满以后会自动关闭中断的问题。

50031185 发表于 2018-8-6 23:54:46

我觉得方法二 更实用, 首先在裸机环境下,方法2 优势明显,
在操作系统中,
方法一 简单好用, 阻塞就阻塞, 单任务阻塞不会影响其他任务运行,
方法2 使用中断 稍微麻烦些,但是 会提升效率, 但是效率提升不会太明显, 因为操作系统本身有任务调度,因此也只能提升少数任务上的效率, 因此串口接收任务效率提升了不见得会对整个系统效率有明显贡献,.

anka120 发表于 2018-8-8 17:59:20

50031185 发表于 2018-8-6 23:54
我觉得方法二 更实用, 首先在裸机环境下,方法2 优势明显,
在操作系统中,
方法一 简单好用, 阻塞就阻塞,...

我是提出这种思路,这种思路推广到其他外设,或者多个外设的时候的选择
页: [1]
查看完整版本: 串口接收超时判断,采用HAL_USART_Receive还是HAL_USART_Receive_IT?