打印
[应用相关]

串口里有队列和只有缓冲区的程序有什么区别

[复制链接]
1736|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 | 只看该作者
如果上层响应够快,就可以不用。否则就要采用。

使用特权

评论回复
5
huangxz| | 2017-11-16 16:56 | 只看该作者
这个主要看单片机的繁忙层度,
如果建立了队列,那么程序主要工作是检查队列,具体收发就由中断处理,
如果单片机本身没什么事情,直接去接收也是可以的.

使用特权

评论回复
6
Garen2| | 2017-11-16 17:05 | 只看该作者
为什么有的队列程序描述的特别复杂,有的又特别简单。。 文中贴出来的程序有while死循环等待,而且头尾指针判断特别简单。 而有的程序,写的很繁琐

使用特权

评论回复
7
xiaoyaodz| | 2017-11-16 17:13 | 只看该作者
FIFO吗?

使用特权

评论回复
8
xiaoyaodz| | 2017-11-16 17:14 | 只看该作者
FIFO就是数据缓冲。

使用特权

评论回复
9
febgxu| | 2017-11-16 17:14 | 只看该作者
这个不是硬件自身的fifo吗

使用特权

评论回复
10
Ryze| | 2017-11-16 17:17 | 只看该作者
复杂一些的肯定是考虑到各种情况,在牺牲一定性能的情况下,能够对数据做更多的保护,更多的稳定性

使用特权

评论回复
11
Varus| | 2017-11-16 17:24 | 只看该作者
串口接收一般还是建议用缓冲,可以设置中断接收,而处理还是可以采用循环查询是方法,分别快捷,相对独立。

使用特权

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

本版积分规则

154

主题

763

帖子

0

粉丝