NRF24L01 的双向通信

一、NRF24l01的双向通信
NRF24l01zu最基本的使用是:一个NRF24l01模块作为数据传输方,另一个NRF24l01作为数据接收方。但有的时候我们需要两个NRF24l01无线传输模块能够进行实时的双向通信,这个时候我们该怎么做呢?
1、首先我们可以把两个NRF24L01无线传输模块都设置为Enhanced ShockBurstTM收发模式,其中一个初始设为发送端我们可以称之为A端,另一个NRF24l01无线传输模初始设置为接收端我们称之为B端。
2、首先A端开始发送数据给B端,如果A端发送数据成功,A端接收到B端发送过来的应答信号,那么A端完成了第一次发送而B端完成了第一次接收,紧接着让A端设置成接收模式,B端设置成发送模式,如果B端发送数据给A端成功并且接收到应答信号那么说明B端完成发送A端完成接收,再让A设置为发送端,B端设置成接收端。如此循环就能够让两个NRF无线传输模块互传信息。原理非常简单就像两个人利用对讲机通讯,你讲话的时候我仔细听,我讲话的时候你仔细听,利用这个方式完成方通信。
3但有的时候因为某些原因比如某些干扰使得一次通信失败使得A和B两端同时设置为一个模式,这时就像是两个人在用对讲机的时候同时说话没有一个人去倾听对方,或者两个人同时倾听对方保持沉默,没有一个人说话,这都会导致程序卡在这里运行不下去。解决这个BUG的方法也很简单:将A端设置为发送数据失败或者接收数据失败到一定次数的时候自动转跳为另一模式。
4、下面给出简单的代码

A端要发送的数据可以在利用中断或者在死循环里面利用按键什么的更新

#define MAX 2     //接收或发送失败后重试的最大次数
u8 Tx_Cnt=0;      //发送次数计数
u8 Rx_Cnt=0;     //接收次数计数
u8 Mode=1; //Mode为1表示发送模式,0表示接收模式
u8 tmp_buf_Tx[32],tmp_buf_Rx[32];   //发送接收缓冲数组
NRF24L01_TX_Mode();
while(1)       //NRF24L01工作在一个无限循环体内
{         
        if (Mode==1)        //发送模式下
       {  
            (NRF24L01_TxPacket(tmp_buf_Tx)==TX_OK)
            {     
               Tx_Cnt=0;
               Mode=0;
               NRF24L01_RX_Mode();   //一旦发送成功则变成接收模式;
            }   
           Tx_Cnt++;
           if (Tx_Cnt==Max) //如果连续发送Max次都失败,则切换为接收模式
           {       
               Tx_Cnt=0;
               Mode=0;
               NRF24L01_RX_Mode();
           }
       }
        else //接收模式下
      {
           if (NRF24L01_RxPacket(tmp_buf_Rx)==0)//一旦接收成功则变成发送模式;
          {
              Rx_Cnt=0;
              Mode=1;
              NRF24L01_TX_Mode();
          }
          Rx_Cnt++;
          if (Rx_Cnt==Max)//如果连续接收Max次都失败,则切换为发送模式
          {
               Rx_Cnt=0;
               Mode=1;
               NRF24L01_TX_Mode();
          }
      } 
 delay_ms(10);   //延时大发送接收慢,延时小发送接收快,太小了可能影响通信可靠性;
}

下面是B端的代码

u8 Mode=0;       //模式标志设置为0 接收端  
NRF24L01_RX_Mode();  //将模式设置为接收模式       
while(1)       //NRF24L01工作在一个无限循环体内
{         
        if (Mode==1)
        {  
              /*这里可以更新要发送的数据*/    
              if (NRF24L01_TxPacket(tmp_buf_Tx)==TX_OK)//发送数据成功
              {     
                   Mode=0;//转变为接收模式
                   NRF24L01_RX_Mode();   //一旦发送成功则变成接收模式;
              }     
         }
        else
        {
              if (NRF24L01_RxPacket(tmp_buf_Rx)==0)//一旦接收成功则变成发送模式;
              {
                   Mode=1;
                   NRF24L01_TX_Mode();
              }
        } 
 delay_ms(2);   //延时大发送接收慢,延时小发送接收快,太小了可能影响通信可靠性;
}

你可能感兴趣的:(嵌入式开发)