串口里,有队列和只有缓冲区的程序区别在哪,如何区别应用?
看到有的串口程序。设置了队列。还有头尾指针,数据计数。而有的只设置了缓冲区。请问,什么时候用哪种方式呢?
另: 都是用队列,
有的用的蛮细:出队列,入队列。头指针&尾指针的比较,从而判断队列 空&满。弄的好细微。比如周立功的。
而有的呢,感觉用的蛮简单。 请问:同是队列,差别咋这么大咧?
以下是简单的:
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];
} |