单片机接收模块FIFO的写法

可以利用FIFO来解决单片机接收数据过程中的阻塞现象。

 

 #define RXBUF_SIZE  32                               //接收FIFO的最大容量

unsigned char RX_BUFF[RXBUF_SIZE];       //接收FIFO缓冲区数组

unsigned int UART_InputLen =0;                   // 接收FIFO内待读取的字节数

unsigned int RX_IndexR =0;                           // 接收FIFO的读指针

unsigned int RX_IndexW =0;                          //接收FIFO的写指针

 


从串口读取1字节数据(从缓冲队列中读取一字节已接收的数据)
char UART0_GetChar(unsigned char *Char)
{
 if(UART_InpLen == 0)                               //如果FIFO内无数据,返回0
  return 0;
  
 _DINT();                                                    // 涉及FIFO操作时不允许中断,以免指针错乱
 
 UART_InpLen--;                                        // 待读取指针数减一
 *Char = RX_BUFF[RX_IndexR];               // 从尾指针读取一个字节作为返回值
 if(++RX_IndexR >= RXBUF_SIZE)           // 读指针递增,且判断是否下标越界
 {
  RX_IndexR=0;                                         // 如果越界则写指针归零(循环队列)

 _EINT();                                                   // FIFO操作完毕,恢复中断允许
 }

 return 1;
}

// 获取FIFO内已接受的数据字节数
unsigned int UART0_GetCharsInRxBuf()
{
 return (UART_InpLen);
}

/ 清除接收FIFO区
void UART0_ClrRxBuf()
{
     _DINT();
    UART_InpLen =0;
    RX_IndexR =0;
    RX_IndexW =0;
    _EINT();
}


/串口中断接收程序
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RX(void)
{
    UART_InpLen++;
    RX_BUFF[RX_IndexW] = U0RXBUF;
    if(++ RX_IndexW >= RXBUF_SIZE)
    {
          RX_IndexW=0;
    }
}

///主程序
void main(void)
{
      unsigned char RxDataBuff[8];
 int i;
 ......
 _UART_ENINT();  // uart interrupt enable
 _EINT();        // enable all interrupts
 while(1)
 {
  _delay_ms(1000);
  if(UART0_GetCharsInRxBuf()>=8)
  {
   for(i=0;i<8;i++)
    UART0_GetChar(RxDataBuff+i);
  }
 }
}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值