如题,看到有的串口程序。设置了队列。还有头尾指针,数据计数。而有的只设置了缓冲区。请问,什么时候用哪种方式呢?
另: 都是用队列,
有的用的蛮细:出队列,入队列。头指针&尾指针的比较,从而判断队列 空&满。弄的好细微。比如周立功的。
而有的呢,感觉用的蛮简单。 请问:同是队列,差别咋这么大咧?
以下是简单的:
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];
}
回复 楼主 yanse51 的帖子
用缓冲主要是为了防止上层对串口接收到的数据来不及处理而丢失。
一般出和入是成对使用的。
如果上层响应够快,就可以不用。否则就要采用。
回复 沙发 Study_Stellaris 的帖子
您说的,我明白。俺想表述的是,为什么有的队列程序描述的特别复杂,有的又特别简单。。 文中贴出来的程序有while死循环等待,而且头尾指针判断特别简单。 而有的程序,写的很繁琐。搞不懂,为什么二者差别这么大?
回复 板凳 yanse51 的帖子
复杂一些的肯定是考虑到各种情况,在牺牲一定性能的情况下,能够对数据做更多的保护,更多的稳定性。具体程序具体分析吧。
串口接收一般还是建议用缓冲,可以设置中断接收,而处理还是可以采用循环查询是方法,分别快捷,相对独立。