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里面的东西找不到啊
页: 1 [2] 3 4 5 6
查看完整版本: Arduino学习笔记A16 - Arduino连接nRF24L01无线收发模块