[应用相关] 串口里有队列和只有缓冲区的程序有什么区别

[复制链接]
2054|10
 楼主| Rangar 发表于 2017-11-16 15:41 | 显示全部楼层 |阅读模式
串口里,有队列和只有缓冲区的程序区别在哪,如何区别应用?
看到有的串口程序。设置了队列。还有头尾指针,数据计数。而有的只设置了缓冲区。请问,什么时候用哪种方式呢?
   另: 都是用队列,
有的用的蛮细:出队列,入队列。头指针&尾指针的比较,从而判断队列 空&满。弄的好细微。比如周立功的。
而有的呢,感觉用的蛮简单。  请问:同是队列,差别咋这么大咧?
    以下是简单的:
    void USART1PutDatatoBuf(u8 dat)
{
u32 tmphead;
tmphead = ( USART1_Rx_Head + 1 ) & USART1_RX_BUF_MARK;//队列头的最大值判断,到达最大,则变回0
USART1_Rx_Head = tmphead;  // 每收一次数据,队列头增加1
USART1_RX_Buf[tmphead] = dat;     
}


**功能:获知缓冲中是否有数据

u8 USART1IsDataInBuf( void )
{
return ( USART1_Rx_Head != USART1_Rx_Tail );
}


**功能:获取缓冲中有效数据的长度

u32 USART1GetBufLen(void)
{
//__disalbe_irq();
if(USART1_Rx_Head>=USART1_Rx_Tail)
{
  //__enable_irq();
  return(USART1_Rx_Head-USART1_Rx_Tail);
}
else
{
  //__enable_irq();
  return(USART1_RX_BUF_MAX+USART1_Rx_Head-USART1_Rx_Tail);
}



}

功能:从队列中获取数据

u8 USART1GetBufDat( void )
{
u32 tmptail;
while ( USART1_Rx_Head == USART1_Rx_Tail );//为防止数据混乱而弄上的硬等待
tmptail = ( USART1_Rx_Tail + 1 ) & USART1_RX_BUF_MARK;
USART1_Rx_Tail = tmptail;
return USART1_RX_Buf[tmptail];
}
Stannis 发表于 2017-11-16 16:33 | 显示全部楼层

用缓冲主要是为了防止上层对串口接收到的数据来不及处理而丢失。
Brand2 发表于 2017-11-16 16:43 | 显示全部楼层
一般出和入是成对使用的。
Soraka 发表于 2017-11-16 16:52 | 显示全部楼层
如果上层响应够快,就可以不用。否则就要采用。
huangxz 发表于 2017-11-16 16:56 | 显示全部楼层
这个主要看单片机的繁忙层度,
如果建立了队列,那么程序主要工作是检查队列,具体收发就由中断处理,
如果单片机本身没什么事情,直接去接收也是可以的.
Garen2 发表于 2017-11-16 17:05 | 显示全部楼层
为什么有的队列程序描述的特别复杂,有的又特别简单。。 文中贴出来的程序有while死循环等待,而且头尾指针判断特别简单。 而有的程序,写的很繁琐
xiaoyaodz 发表于 2017-11-16 17:13 | 显示全部楼层
FIFO吗?
xiaoyaodz 发表于 2017-11-16 17:14 | 显示全部楼层
FIFO就是数据缓冲。
febgxu 发表于 2017-11-16 17:14 | 显示全部楼层
这个不是硬件自身的fifo吗
Ryze 发表于 2017-11-16 17:17 | 显示全部楼层
复杂一些的肯定是考虑到各种情况,在牺牲一定性能的情况下,能够对数据做更多的保护,更多的稳定性
Varus 发表于 2017-11-16 17:24 | 显示全部楼层
串口接收一般还是建议用缓冲,可以设置中断接收,而处理还是可以采用循环查询是方法,分别快捷,相对独立。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

154

主题

763

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部