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