串口接收超时判断,采用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检查过程中,可以做其他事情。
采用中断的方式好像没有什么优势??
大家有什么看法
但是HAL_USART_Receive接收不到或接收不完整的频率很高 中断方式可以迅速反应事件以便及时处理。特别是USART,可以减少通讯数据丢失 wenyangzeng 发表于 2018-7-3 09:24
中断方式可以迅速反应事件以便及时处理。特别是USART,可以减少通讯数据丢失 ...
HAL_USART_Receive 本身存在通讯不稳定的问题?哥们使用真存在该问题? wenyangzeng 发表于 2018-7-3 09:24
中断方式可以迅速反应事件以便及时处理。特别是USART,可以减少通讯数据丢失 ...
HAL_USART_Receive 本身存在通讯不稳定的问题?哥们使用真存在该问题? anka120 发表于 2018-7-3 09:33
HAL_USART_Receive 本身存在通讯不稳定的问题?哥们使用真存在该问题?
HAL_USART_Receive 不存在通讯不稳定的问题,主要是采用中断方式时,可以在系统任务繁忙时能够及时接收USART数据。 针对 超时判断的情况,如之前描述,没有发现方法一比方法二更加及时啊 :dizzy: 看使用环境吧。我感觉两个都不是很好用。还是习惯使用之前的标准库,串口这里完全不用考虑接收满以后会自动关闭中断的问题。 我觉得方法二 更实用, 首先在裸机环境下,方法2 优势明显,
在操作系统中,
方法一 简单好用, 阻塞就阻塞, 单任务阻塞不会影响其他任务运行,
方法2 使用中断 稍微麻烦些,但是 会提升效率, 但是效率提升不会太明显, 因为操作系统本身有任务调度,因此也只能提升少数任务上的效率, 因此串口接收任务效率提升了不见得会对整个系统效率有明显贡献,.
50031185 发表于 2018-8-6 23:54
我觉得方法二 更实用, 首先在裸机环境下,方法2 优势明显,
在操作系统中,
方法一 简单好用, 阻塞就阻塞,...
我是提出这种思路,这种思路推广到其他外设,或者多个外设的时候的选择
页:
[1]