下面是双向通信的基本原理和方法,只是说明大体结构,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); //延时大发送接收慢,延时小发送接收快,太小了可能影响通信可靠性;
}
原理分析:为方便分析,将第一段程序称为主机,第二段程序称为从机。
首先明白,不过主机还是从机,都有一个共性,就是一旦接收或发送成功则立即切换模式;
区别是,从机只有在接收或发送成功后才切换模式,不然的话会一直处于当前模式下,无法切换;
对于主机来说,从机的这个特性恰好符合主机达到最大发送接收次数的自动模式切换;
到底怎么个符合呢?
下面举例说明:
正常情况下,主机成功发送一个数据包,立即变成接收模式,从机成功接收到数据包,立即变成发送模式;这样就双向通信;
异常情况下,外界干扰,或者本身延时导致时间上的不匹配,可能主机和从机都变成了接收模式,这时数据停止传输,从机的模式无法切换;
但是当主机达到最大接收次数后,则切换为发送模式,此时从机就可以接收数据了;同时变成发送模式也一样的;
更多回帖