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();
}
运行效果:
库文件发现错误,维护中
延迟怎么样?我也做了双向数据传输,但是有80ms的延迟。不知道怎么解决,而且有一定几率丢包 mylemonjuice 发表于 2014-12-24 11:21 static/image/common/back.gif
延迟怎么样?我也做了双向数据传输,但是有80ms的延迟。不知道怎么解决,而且有一定几率丢包
延迟我倒是没测试过,丢包我的不会,因为应答交给中断了 是可靠传输吗?双向传输还要考虑载波侦听。 451506709 发表于 2014-12-24 11:32 static/image/common/back.gif
是可靠传输吗?双向传输还要考虑载波侦听。
半双工,SPI环形协议原理类似 mylife1213 发表于 2014-12-24 11:31 static/image/common/back.gif
延迟我倒是没测试过,丢包我的不会,因为应答交给中断了
我的倒是没有用到中断。你测一下呗,看收发一次用多长时间 谢谢分享,学习一下 mylemonjuice 发表于 2014-12-24 11:49 static/image/common/back.gif
我的倒是没有用到中断。你测一下呗,看收发一次用多长时间
0.9ms 收发间隔 mylife1213 发表于 2014-12-24 11:31 static/image/common/back.gif
延迟我倒是没测试过,丢包我的不会,因为应答交给中断了
丢包和处理方式没有必然联系
虽然处理方式不妥可能导致丢包 但是丢包还有可能是其他问题导致的
就好像UDP协议丢包似乎就是正常的 TCP/IP协议则是采取手段 三次握手 然后遇到丢包就要求重新发
如果可能加入丢包重发机制可能会避免丢包
大量节点通讯 延迟就高了 哎~~~毕竟资源抢占太严重。。。带宽也就那么点
估计实际带几百个 延迟还在可以接受的程度。大了 就不适合及时性要求高的项目了(比如航模的控制) mylife1213 发表于 2014-12-24 13:01 static/image/common/back.gif
0.9ms 收发间隔
差这么多哦。不过我两边都在跑程序,可能因为两边程序时间相差太大导致。从机跑一遍都5ms了 darkorigin 发表于 2014-12-24 16:31 static/image/common/back.gif
丢包和处理方式没有必然联系
虽然处理方式不妥可能导致丢包 但是丢包还有可能是其他问题导致的
就好像U ...
已经有丢包检测了" nrf.send_data(TX_ADDRESS , tx_data) 会有返回值,这样可以选择是否重发. 中断处理很有必要,主机我设置了100ms超时检测,如果在100ms次机没有应答信号程序就判断丢包,所以及时的给应答很重要. 节点是不能太多,会出现通讯碰撞,也会丢包 mylemonjuice 发表于 2014-12-24 17:27 static/image/common/back.gif
差这么多哦。不过我两边都在跑程序,可能因为两边程序时间相差太大导致。从机跑一遍都5ms了
一定要使用中断去应答,除非你可以保证无延时检测寄存器状态 mylife1213 发表于 2014-12-24 17:43 static/image/common/back.gif
一定要使用中断去应答,除非你可以保证无延时检测寄存器状态
反正我数据传输对实时性要求不高,100ms也能接受吧,丢包也不是很严重,周围信号复杂的时候偶尔会看到丢一个包 :funk:好犀利的感觉啊~ 我说的是多节点情况下航模。还有就是通讯冲突
比如同区域内多组模块之间的干扰
页:
[1]
2