pumpitup
发表于 2015-6-23 21:38:42
还有,我把 63. if(adata != oldadata) 这个判断去掉了
应该不会发送一次,就收到很多次吧。
gh03hjc
发表于 2015-6-24 01:48:27
zhangdeyue1 发表于 2015-3-26 11:32 static/image/common/back.gif
谢谢!
最近在做双向通讯的时候出现一个问题
就是开始是打算主机发送指令,从机接到后返回一个固定指令 ...
这个功能模块就有,叫自动应答,不用自己做的,查一下寄存器的表,打开它就行!
gh03hjc
发表于 2015-6-24 01:55:40
pumpitup 发表于 2015-6-23 21:38 static/image/common/back.gif
还有,我把 63. if(adata != oldadata) 这个判断去掉了
应该不会发送一次,就收到很多次吧。
取决于你开自动重发和应答没有,如果来了,自动应答信号不是每次都传到从机,所以虽然主机接受到信息,但由于从机没有收到自动应答信号,从机会自动重发,这样就会收到多个。模块本身也会去重,取决于PID和CRC码
pumpitup
发表于 2015-6-24 21:05:14
本帖最后由 pumpitup 于 2015-6-24 21:06 编辑
gh03hjc 发表于 2015-6-24 01:55 static/image/common/back.gif
取决于你开自动重发和应答没有,如果来了,自动应答信号不是每次都传到从机,所以虽然主机接受到信息,但 ...
看来想用好,得学好多东西啊。
不过感觉这个if有点山寨。我做了个遥控小车的,其实从机是在不断发送信息,但是由于没有动电位器所以发的都是一样的,然后不变的内容都被主机忽略了。
对了,Serial.begin(9600)在nRF24L01的使用中是必须的么?为什么我主机端需要接USB才能收到信息呢?去掉Serial.begin这句就会报错。
还有就是,如果没有开从机,主机复位的时候也会收到信息。我上面的很大的数可能就是这么来的。
gh03hjc
发表于 2015-6-29 06:53:56
pumpitup 发表于 2015-6-24 21:05 static/image/common/back.gif
看来想用好,得学好多东西啊。
不过感觉这个if有点山寨。我做了个遥控小车的,其实从机是在不断发送 ...
看来你还不是很通Arduino 的函数,Serial.begin()是一定要的,它开启Arduino 和电脑之间联系之门!
然后你说什么从机不开?Nrf24哪有主从之分?我猜你可能是指发射机不开,但接收机仍然有数据?那不可能吧,除非你是关了发射机Arduino 的电但没有关发射机Nrf 24的电吧!
gh03hjc
发表于 2015-6-29 07:07:55
pumpitup 发表于 2015-6-24 21:05 static/image/common/back.gif
看来想用好,得学好多东西啊。
不过感觉这个if有点山寨。我做了个遥控小车的,其实从机是在不断发送 ...
看来你还不是很通Arduino 的函数,Serial.begin()是一定要的,它开启Arduino 和电脑之间联系之门!
然后你说什么从机不开?Nrf24哪有主从之分?我猜你可能是指发射机不开,但接收机仍然有数据?那不可能吧,除非你是关了发射机Arduino 的电但没有关发射机Nrf 24的电吧!
pumpitup
发表于 2015-6-29 10:42:33
gh03hjc 发表于 2015-6-29 06:53 static/image/common/back.gif
看来你还不是很通Arduino 的函数,Serial.begin()是一定要的,它开启Arduino 和电脑之间联系之门!
然后 ...
Serial只是用来debug用的。
调试好了当然要去掉所有的Serial的东西了。我可以用其它的东西来查看程序运行正确与否。
有两个问题:
Serial与RF24L01的使用有没有关系。
Serial的使用会不会影响0、1口的使用。是不是如果我想用0、1口就必须不使用Serial。
gh03hjc
发表于 2015-6-29 11:08:06
pumpitup 发表于 2015-6-29 10:42 static/image/common/back.gif
Serial只是用来debug用的。
调试好了当然要去掉所有的Serial的东西了。我可以用其它的东西来查看程序运 ...
Nrf24与serial没有直接关系,但你要用Serial就要用0.1
pumpitup
发表于 2015-6-29 22:43:09
gh03hjc 发表于 2015-6-29 11:08 static/image/common/back.gif
Nrf24与serial没有直接关系,但你要用Serial就要用0.1
问题就在这里。
被控机接在电脑上的时候,一切正常。一旦拔下Usb线,那就无法遥控了。不知道是怎么回事儿。
pumpitup
发表于 2015-7-10 11:07:03
LZ,RADDR是不是就是本机的名字,TADDR是不是就是对方的名字?
是不是每台机器都要有本机的名字,如果是发送放则需要设置对方的名字?
接受是,对方的目的与本机的名字要一样,通道也要一样对吧。
hardstudy12345
发表于 2015-7-16 10:40:49
非常好的例子,写的也很详细,谢谢楼主!
三公分阳光
发表于 2015-8-12 00:39:41
楼主你好,我想请教下,如果一次发送多个传感器的数据该怎么改呢?我试着改了一下你的程序,但是只能接收到第一个传感器的数据,第二个传感器的数据一直不对,能帮我看下吗?谢谢了
发送端程序
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
Serial.begin(9600);
Mirf.cePin = 8; //设置CE引脚为D9
Mirf.csnPin = 7; //设置CE引脚为D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init();//初始化nRF24L01
//设置接收标识符"Sen01"
Mirf.setRADDR((byte *)"Sen01");
Mirf.payload = sizeof(unsigned int);
Mirf.channel = 3;
Mirf.config();
//注意一个Arduino写Sender.ino,另一个写Receiver.ino。
//这里标识写入了Sender.ino
Serial.println("I'm Sender...");
}
unsigned int adata = 0;
unsigned int bdata = 0;
void loop()
{
//读取A0值到adata
adata = analogRead(A0);
bdata = analogRead(A1);
//由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
//所以必须将所有需要传输的数据拆成byte。
//下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
//实际下面等于byte data;
byte data;
//adata是unsigned int双字节数据,必须拆开。
//将adata高低八位拆分:
data = adata & 0xFF; //低八位给data,
data = adata >> 8; //高八位给data。
data = bdata & 0xFF; //低八位给data,
data = bdata >> 8;
//设置向"serv1"发送数据
Mirf.setTADDR((byte *)"Rec01");
Mirf.send(data);
//while死循环等待发送完毕,才能进行下一步操作。
while(Mirf.isSending()) {}
Serial.println(adata);
Serial.print("*****");
Serial.println(bdata,DEC);
delay(3000);
}
接收端程序:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
//定义一个变量adata存储最终结果,oldadata存储旧结果,防止相同结果刷屏。
unsigned int adata = 0, bdata = 0;
void setup()
{
Serial.begin(9600);
//---------初始化部分,不可随时修改---------
Mirf.cePin = 8; //设置CE引脚为D9
Mirf.csnPin = 7; //设置CE引脚为D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init();//初始化nRF24L01
//---------配置部分,可以随时修改---------
//设置接收标识符"Rev01"
Mirf.setRADDR((byte *)"Rec01");
//设置一次收发的字节数,这里发一个整数,
//写sizeof(unsigned int),实际等于2字节
Mirf.payload = sizeof(unsigned int);
//发送通道,可以填0~128,收发必须一致。
Mirf.channel = 3;
Mirf.config();
//注意一个Arduino写Sender.ino,另一个写Receiver.ino。
//这里用来辨别写入了Receiver.ino程序
Serial.println("I'm Receiver...");
}
void loop()
{
//定义一个暂存数组,大小为Mirf.payload。
byte data;
if(Mirf.dataReady()) //等待接收数据准备好
{
Mirf.getData(data); //接收数据到data数组
//data<左移8位与data并,重组数据。
adata = (unsigned int)((data << 8) | data);
bdata = (unsigned int)((data << 8) | data);
Serial.println(adata);
Serial.print("*****");
Serial.println(bdata,DEC);
}
}
求指教,十分感谢!
chilinhui6
发表于 2015-8-23 20:23:21
大神求指点!怎么从主机串口读入字符串,从机串口输出字符串呢??求代码
chawuciren_1
发表于 2015-8-23 22:31:31
学习一下,谢谢楼主
ariel
发表于 2015-11-29 20:45:09
本帖最后由 ariel 于 2015-11-29 20:52 编辑
楼主,我直接复制的代码,还是接收不到,感觉是因为adata和olddata一直一样的关系。
第一段发送代码,setRADDR的值为什么跟接收中的setRADDR不一样啊,
对了,还有,getData()里面那个spi里面的东西找不到啊