天线|RF射频
直播中

王静

7年用户 684经验值
私信 关注
[问答]

NRF24L01双向通信断线自动重连类似全双工怎么回事

                                         
下面是双向通信的基本原理和方法,只是说明大体结构,NRF函数是调用原子大哥的,简单容易理解;


#define Recon_Delay_Cnt 2     //重连延时计数,范围在1~255,值越大重连延时越大;也可以理解为是最大发送接收次数


u8 Tx_Cnt=0;         //发送次数计数

u8 Rx_Cnt=0;         //接收次数计数

u8 NRF24L01_Mode=0;        //0表示发送模式,1表示接收模式

u8 tmp_buf_Tx[32],tmp_buf_Rx[32];   //发送接收缓冲数组


NRF24L01_TX_Mode();

while(1)       //NRF24L01工作在一个无限循环体内

{         

        if (NRF24L01_Mode==0)

       {  

            tmp_buf_Tx[0]=0x11;     

            if (NRF24L01_TxPacket(tmp_buf_Tx)==TX_OK)

            {     

               Tx_Cnt=0;

               NRF24L01_Mode=1;

               NRF24L01_RX_Mode();   //一旦发送成功则变成接收模式;

            }   

           Tx_Cnt++;

           if (Tx_Cnt==Recon_Delay_Cnt) //如果连续发送Recon_Delay_Cnt次都失败,则切换为接收模式

           {      

               Tx_Cnt=0;

               NRF24L01_Mode=1;

               NRF24L01_RX_Mode();

           }

       }

       else

      {

           if (NRF24L01_RxPacket(tmp_buf_Rx)==0)//一旦接收成功则变成发送模式;

          {

              Rx_Cnt=0;

              NRF24L01_Mode=0;

              NRF24L01_TX_Mode();

          }

          Rx_Cnt++;

          if (Rx_Cnt==Recon_Delay_Cnt)//如果连续接收Recon_Delay_Cnt次都失败,则切换为发送模式

          {

               Rx_Cnt=0;

               NRF24L01_Mode=0;

               NRF24L01_TX_Mode();

          }

      }

delay_ms(10);   //延时大发送接收慢,延时小发送接收快,太小了可能影响通信可靠性;

}


说明:测试通过,并且应用到我的小四轴上了;

测试条件:原子的开发板,一个STM32f103c8t6最小系统;

测试时利用上面的程序进行如下修改;

         原子开发板部分:程序和上面的一样;

         最小系统部分:延时变为delay_ms(2);取消了断线重连功能,因为只有有一端有这个功能就会连接成功;

         程序如下:

u8 NRF24L01_Mode=1;         

NRF24L01_RX_Mode();         

while(1)       //NRF24L01工作在一个无限循环体内

{         

        if (NRF24L01_Mode==0)

        {  

              tmp_buf_Tx[0]=0x11;     

              if (NRF24L01_TxPacket(tmp_buf_Tx)==TX_OK)

              {     

                   NRF24L01_Mode=1;

                   NRF24L01_RX_Mode();   //一旦发送成功则变成接收模式;

              }     

         }

        else

        {

              if (NRF24L01_RxPacket(tmp_buf_Rx)==0)//一旦接收成功则变成发送模式;

              {

                   NRF24L01_Mode=0;

                   NRF24L01_TX_Mode();

              }

        }

delay_ms(2);   //延时大发送接收慢,延时小发送接收快,太小了可能影响通信可靠性;

}

原理分析:为方便分析,将第一段程序称为主机,第二段程序称为从机。

首先明白,不过主机还是从机,都有一个共性,就是一旦接收或发送成功则立即切换模式;

区别是,从机只有在接收或发送成功后才切换模式,不然的话会一直处于当前模式下,无法切换;

对于主机来说,从机的这个特性恰好符合主机达到最大发送接收次数的自动模式切换;

到底怎么个符合呢?


下面举例说明:

正常情况下,主机成功发送一个数据包,立即变成接收模式,从机成功接收到数据包,立即变成发送模式;这样就双向通信;

异常情况下,外界干扰,或者本身延时导致时间上的不匹配,可能主机和从机都变成了接收模式,这时数据停止传输,从机的模式无法切换;

但是当主机达到最大接收次数后,则切换为发送模式,此时从机就可以接收数据了;同时变成发送模式也一样的;            


NRF34L01双向通信.rar (1.52 KB )

回帖(42)

娄莉莉

2020-6-17 06:36:16
不错,我以前做无线通信的时候为了保证发送或接受成功直接这样用while(!(NRF24L01_TxPacket(tmp_buf_Tx)==TX_OK));
举报

h1654155275.5950

2020-6-17 06:52:33
你这是用一个通道。这方法确实可行,不过感觉浪费时间,012345通道都可以应答通讯,何不好好利用,发射的地址是和0通道绑定的,可以这样通讯,

                  甲乙2模块:甲(发0通道对应乙收5通道应答通讯)《甲发射数据给乙(应答模式)》

                                   乙(发0通道对应甲收5通道应答通讯)《乙发射数据给甲(应答模式)》

收发模式切换用:甲先发射模式,发射成功立刻切换接收模式。发射不成功1秒后切换接收模式。

                        乙先发射模式,发射成功立刻切换接收模式。发射不成功1.5秒后切换接收模式。

如果成功对接了,那这2模块通讯效率应该最高。(0x00寄存器bit0切换非常快。)
举报

李麒

2020-6-17 07:04:32

请问甲模块和乙模块的寄存器具体怎么配置?
举报

唐芳

2020-6-17 07:19:03
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分