mylife1213 发表于 2014-12-24 10:16:07

NRF24L01+双向通讯

本帖最后由 mylife1213 于 2015-2-25 23:35 编辑


nrf24l01+双向通讯,支持5个字节地址的节点数

主机:

#include <nrf24l01.h>

/*
接线方式:UNO ,Pro Mini ,Nano ,Duemilanove                  MEGA2560 , ADK
CE-pin9                                                         CE-pin9
CS-pin8                                                         CS-pin8
SCK-pin13                                                         SCK-pin52
MISO-pin12                                                      MISO-pin50
MOSI-pin11                                                      MOSI-pin51
IRQ-pin2                                                          IRQ-pin2
----------------------------------------------------------------------------------
*/
#define uchar unsigned char
nrf24l01 nrf;
uchar TX_ADDRESS[]={192, 168, 10, 10, 6};
uchar RX_ADD_P1[]={192, 168, 10, 10, 10};                                                         
uchar RX_PW=10;                        
uchar tx_data;
uchar rx_data={0};

unsigned char n=0;

void setup()
{
Serial.begin(9600);
nrf.initialize();//初始化
nrf.Send_mode();
}
void loop()
{
    *nrf.send_data_=n--;
    *nrf.send_data_=n-2;
    *nrf.send_data_=n-3;
    *nrf.send_data_=n-4;
    *nrf.send_data_=n-5;

if(nrf.send_data(TX_ADDRESS , tx_data)){
    Serial.print("Mac: ");
    for(uchar x=0;x<5;++x){
      Serial.print( rx_data );
      Serial.print(" : ");
    }
    Serial.print("Data: ");
   for(uchar x=5;x<RX_PW;++x){
      Serial.print( rx_data );
      Serial.print(" : ");
   }
   Serial.println(" ");
}
else {
    Serial.println("Time Out!");
}


   
delay(500);
                                                                                          
}



从机:

#include <nrf24l01.h>
/*
接线方式:UNO ,Pro Mini ,Nano ,Duemilanove                  MEGA2560 , ADK
CE-pin9                                                         CE-pin9
CS-pin8                                                         CS-pin8
SCK-pin13                                                         SCK-pin52
MISO-pin12                                                      MISO-pin50
MOSI-pin11                                                      MOSI-pin51
IRQ-pin2                                                          IRQ-pin2
----------------------------------------------------------------------------------
*/
#define uchar unsigned char
nrf24l01 nrf;
uchar RX_ADD_P1={192, 168, 10, 10, 6};                                                                                                   
uchar RX_PW=10;   
uchar tx_data={0};
uchar rx_data={0};//声明接收变量

unsigned char n=0;

void setup()
{
Serial.begin(9600);
nrf.initialize(); //初始化
nrf.SPI_RW_Reg(WRITE_REG + CONFIG, 0x3F);
attachInterrupt(0, test, FALLING );
   nrf.read_data_status=true;
}
void loop()
{
   
if( !nrf.read_data_status ){
   
    *nrf.send_data_=n++;
    *nrf.send_data_=n+2;
    *nrf.send_data_=n+3;
    *nrf.send_data_=n+4;
    *nrf.send_data_=n+5;
   
   
   Serial.print("Mac: ");
    for(uchar x=0;x<5;++x){
      Serial.print( rx_data );
      Serial.print(" : ");
    }
    Serial.print("Data: ");
   for(uchar x=5;x<RX_PW;++x){
      Serial.print( rx_data );
      Serial.print(" : ");
   }
   Serial.println(" ");
   
   nrf.read_data_status=true;
}

}

void test(){
nrf.read_data_irq();
}




运行效果:


库文件发现错误,维护中

mylemonjuice 发表于 2014-12-24 11:21:38

延迟怎么样?我也做了双向数据传输,但是有80ms的延迟。不知道怎么解决,而且有一定几率丢包

mylife1213 发表于 2014-12-24 11:31:25

mylemonjuice 发表于 2014-12-24 11:21 static/image/common/back.gif
延迟怎么样?我也做了双向数据传输,但是有80ms的延迟。不知道怎么解决,而且有一定几率丢包

延迟我倒是没测试过,丢包我的不会,因为应答交给中断了

451506709 发表于 2014-12-24 11:32:37

是可靠传输吗?双向传输还要考虑载波侦听。

mylife1213 发表于 2014-12-24 11:34:01

451506709 发表于 2014-12-24 11:32 static/image/common/back.gif
是可靠传输吗?双向传输还要考虑载波侦听。

半双工,SPI环形协议原理类似

mylemonjuice 发表于 2014-12-24 11:49:39

mylife1213 发表于 2014-12-24 11:31 static/image/common/back.gif
延迟我倒是没测试过,丢包我的不会,因为应答交给中断了

我的倒是没有用到中断。你测一下呗,看收发一次用多长时间

suoma 发表于 2014-12-24 12:20:59

谢谢分享,学习一下

mylife1213 发表于 2014-12-24 13:01:43

mylemonjuice 发表于 2014-12-24 11:49 static/image/common/back.gif
我的倒是没有用到中断。你测一下呗,看收发一次用多长时间

0.9ms 收发间隔

darkorigin 发表于 2014-12-24 16:31:37

mylife1213 发表于 2014-12-24 11:31 static/image/common/back.gif
延迟我倒是没测试过,丢包我的不会,因为应答交给中断了

丢包和处理方式没有必然联系
虽然处理方式不妥可能导致丢包 但是丢包还有可能是其他问题导致的
就好像UDP协议丢包似乎就是正常的 TCP/IP协议则是采取手段 三次握手 然后遇到丢包就要求重新发

如果可能加入丢包重发机制可能会避免丢包

大量节点通讯 延迟就高了 哎~~~毕竟资源抢占太严重。。。带宽也就那么点

估计实际带几百个 延迟还在可以接受的程度。大了 就不适合及时性要求高的项目了(比如航模的控制)

mylemonjuice 发表于 2014-12-24 17:27:45

mylife1213 发表于 2014-12-24 13:01 static/image/common/back.gif
0.9ms 收发间隔

差这么多哦。不过我两边都在跑程序,可能因为两边程序时间相差太大导致。从机跑一遍都5ms了

mylife1213 发表于 2014-12-24 17:42:26

darkorigin 发表于 2014-12-24 16:31 static/image/common/back.gif
丢包和处理方式没有必然联系
虽然处理方式不妥可能导致丢包 但是丢包还有可能是其他问题导致的
就好像U ...

已经有丢包检测了" nrf.send_data(TX_ADDRESS , tx_data) 会有返回值,这样可以选择是否重发. 中断处理很有必要,主机我设置了100ms超时检测,如果在100ms次机没有应答信号程序就判断丢包,所以及时的给应答很重要. 节点是不能太多,会出现通讯碰撞,也会丢包

mylife1213 发表于 2014-12-24 17:43:44

mylemonjuice 发表于 2014-12-24 17:27 static/image/common/back.gif
差这么多哦。不过我两边都在跑程序,可能因为两边程序时间相差太大导致。从机跑一遍都5ms了

一定要使用中断去应答,除非你可以保证无延时检测寄存器状态

mylemonjuice 发表于 2014-12-24 17:57:48

mylife1213 发表于 2014-12-24 17:43 static/image/common/back.gif
一定要使用中断去应答,除非你可以保证无延时检测寄存器状态

反正我数据传输对实时性要求不高,100ms也能接受吧,丢包也不是很严重,周围信号复杂的时候偶尔会看到丢一个包

maxims 发表于 2014-12-24 19:04:27

:funk:好犀利的感觉啊~

darkorigin 发表于 2014-12-25 13:08:48

我说的是多节点情况下航模。还有就是通讯冲突
比如同区域内多组模块之间的干扰
页: [1] 2
查看完整版本: NRF24L01+双向通讯