打印

串口里,有队列和只有缓冲区的程序区别在哪,如何区别应用?

[复制链接]
1452|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanse51|  楼主 | 2013-6-18 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    如题,看到有的串口程序。设置了队列。还有头尾指针,数据计数。而有的只设置了缓冲区。请问,什么时候用哪种方式呢?
   另: 都是用队列,
有的用的蛮细:出队列,入队列。头指针&尾指针的比较,从而判断队列 空&满。弄的好细微。比如周立功的。
而有的呢,感觉用的蛮简单。  请问:同是队列,差别咋这么大咧?
    以下是简单的:
    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];
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

88

帖子

0

粉丝