请教大家一个NRF24L01无线通信的问题

2019-07-18 14:51发布

请教一下,想用51单片机实现NRF24L01之间的无线通信,主机上有按键按下时,将按键对应的数字发出去,从机收到数字判断是否和自身编号相同,若相同则对应从机将测量得到的某数据发送给主机,即实现主机到从机,从机到主机的无线通信。。。。。。该设想在最简单的无线通信程序中可以实现(即不加入其他测量数据的函数,仅仅是发送固定数据),但一旦加入测量数据的函数,从机发送给主机的数据信息主机就无法接收到,不知道是为什么,求教诸路大神指点一下。
主机主函数:
void main()
{
    uint i = 0;
    uint key;
    CE = 0;
    SCK = 0;
    CSN = 1;
    Serial_Init();                //初始化串口       
        while(1)
        {
          uint flag=1,flag1=1;
          //先检测是否有按键按下,若有则发送该按键对应的数字给从机
          while(flag)
          {
            key=keyscan();
                if((key==1)|(key==2))
                flag=0;
          }       

          TX_Mode();
          Delay(100);                    
          if(key==1)
            {
                  LED0=0;
              Transmit(Tx_Buf1);                  
              Serial_SendString(Tx_Buf1);
            }
          if(key==2)
            {
              LED1=0;
              Transmit(Tx_Buf2);                   
              Serial_SendString(Tx_Buf2);       
            }
          while(CheckACK());
          Delay(100);
          
      //****************接收模式************//
          RX_Mode();
          Delay(100);//防止编译警告
          while(flag1)
          {
           if(nRF24L01_RxPacket(Rx_Buf))
           {
                 Serial_SendString(Rx_Buf);
                 flag1=0;
           }
           else
            {  
                  LED2=0;
                  continue;
                }
}  } }               



从机主函数:
void main( )
{             
   uchar status;
   uchar flag=1;
   uchar k;   
   //初始化NRF24L01
   CE = 0;
   SCK = 0;
   CSN = 1;

   Serial_Init();                  //串口初始化
   Init_ADXL345();                 //初始化ADXL345

   #if MODE
         PcdReset();
     PcdAntennaOff();
     PcdAntennaOn();       
   #endif       

         
         while(flag)                                         //若有卡刷卡则读出卡号并跳出循环,若无卡,则一直循环,后面的程序不执行
         {
           for(i=0;i<8;i++)
                 {
                   Tx_Buf=1;
                 }
           status = PcdRequest(PICC_REQALL, g_ucTempbuf);
       if(status != MI_OK)
         {   
                   continue;
         }         
       status = PcdAnticoll(g_ucTempbuf);
       if(status != MI_OK)
         {   
                   continue;   
                 }
                  
                 //读出卡号,前4个字节
           for(i=0;i<2;i++ )
                 {
                   CardNum = g_ucTempbuf;
                   Tx_Buf=g_ucTempbuf;
                 }

           flag=0;
         }
         //LED=0;
         
         
                                              
     while ( 1 )
     {  
         //先处于接收模式,收到主机发出的按键操作对应的数对比之后再转化为发送模式,对比不相等则后续操作不执行
        RX_Mode();
        Delay(100);//防止编译警告                                          
                if(nRF24L01_RxPacket(Rx_Buf1))
                {                  
                  if((Rx_Buf1[0]==0x01)|(Rx_Buf1[0]==0x02))
//                  if(Rx_Buf1[0]==0x02)
                        {
                          LED=0;
                      Serial_SendString(Rx_Buf1);
                        }
//                  else
//                        LED=0;
                }
                else
                 continue;
               
               
                  
                #if MODE
                 Multiple_Read_ADXL345(); //调用该函数,九轴读取姿态数据存放在BUF中
                 //LED=~LED;        
                 Delay(100);
                 
                 for(i=0;i<6;i++)
                 {
                    if(BUF==0)
                        {
                          BUF=1;
                        }
                        Tx_Buf[2+i] = BUF;
               
                 }
                 
                  //发送 模式代码        让从机发送10000次,因为找不到退出循环的条件所以没有用while               
                 TX_Mode();
                 Delay(100);
                                            
                 for(k=0;k<10000;k++)
                 {
                   Transmit(Tx_Buf);
                   Serial_SendString(Tx_Buf);
                   while(CheckACK());
                   //LED=0;                  
                   Delay(100);
                   LED=1;                               
                 }

                        #endif
                  

    }
}
       

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
201302030107
1楼-- · 2019-07-18 16:29
网上类似的程序一大片,多找几个看看
201302030107
2楼-- · 2019-07-18 22:26
你可以参考参考

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
zengjunchi
3楼-- · 2019-07-18 23:44
 精彩回答 2  元偷偷看……

一周热门 更多>