三公分阳光 发表于 2015-7-24 21:41:01

求助 关于nRF24L01的问题

想用一块arduino板接收多个传感器数据,通过nRF24L01发送到另一块arduino板上,今天下午我也翻了很多大神的帖子,也尝试过通过一个端口像另一个端口发送数据,也成功过了。但是不知道为什么加上传感器就不行了- -
现在有两个问题想向大家请教:
1.接收传感器数据的代码该怎么改?
2.如果是发送多个传感器的数据该怎么写程序?
这两个问题想了一天了,没什么思路。希望大家帮帮忙,谢谢啦

chensg 发表于 2015-7-25 11:41:55

使用数组,一起发送,接收后拆分,很好用的方法!:lol

liuxue4503 发表于 2015-7-26 03:59:56

两个部分:
1,先搞定通讯,主机发送什么,从机能够接收到,就OK。在此基础上做到能够发送一个传感器的数据
2,多个数据的发送,自己定个简单的协议,或者固定了位数一大串地发过去,接收到以后按长度拆开。

pzg123 发表于 2015-7-28 20:51:01

本帖最后由 pzg123 于 2015-7-28 20:56 编辑

收到数据再返回数据

/***NRF24l01针脚连接线:MISO->12; MOSI->11; SCK->13; CE->9; CSN->10***/

#include <SPI.h> //引用SPI库文件
#include <Mirf.h> //引用Mirf库文件
#include <nRF24L01.h> //引用NRF24L01库文件
#include <MirfHardwareSpiDriver.h> //引用Mirf驱动库文件

char nrfData={0};

void setup(){
Serial.begin(115200); //设置串口波特率115200

//初始化Mirf,用于NRF24L01收发
char client={0}; //客户端名称
sprintf(client,"clie%d",1); //设置客户端名称=clie1
Mirf_Init(0,client,1); //初始化NRF24L01 设置接收地址=clie1 频道=1
}

void loop(){
////NRF24l01接收数据
byte data;//声明字节
if (Mirf.dataReady()){
    Mirf.getData((byte *) &nrfData);   
    Serial.print("rxdata=");
    Serial.println(nrfData);

    delay(50);//延时


    ////NRF24l01发送数据
    char server={0};//声明接收名称
    sprintf(server,"serv%d",1);//赋值接收名称
    Mirf_Init(2,server,1);//设置发送模式
    Mirf.send((byte *) &nrfData); //发送给NRF24L01
    while(Mirf.isSending()){}//等待发送完闭
    Serial.print("txdata=");
    Serial.print(nrfData);
    Serial.println(", ok");
    char client={0}; //本设备名称
    sprintf(client,"clie%d",1); //设置本设备名称=clie1
    Mirf_Init(1,client,1); //设置接收模式,地址=clie1 频道=1
}
Mirf.rxFifoEmpty();

}

////初始化Mirf 0初始化1为接收2为发送
void Mirf_Init(int mode,char *address,int channel){
////初始化Mirf,用于NRF24l01收发      
if(mode==0){   
    Mirf.spi = &MirfHardwareSpi;//设置spi
    Mirf.init();//初始Mirf
    Mirf.setRADDR((byte *)address);//设置接收地址
}

////设置接收模式
if(mode==1) Mirf.setRADDR((byte *)address);//设置接收地址

////设置发送模式
if(mode==2) Mirf.setTADDR((byte *)address);//设置发送地址
Mirf.payload = sizeof(rxData);//收发字节
Mirf.channel = channel;//设置频道
Mirf.config();//生效配置
}

三公分阳光 发表于 2015-8-11 18:56:54

chensg 发表于 2015-7-25 11:41 static/image/common/back.gif
使用数组,一起发送,接收后拆分,很好用的方法!

不好意思看到晚了,我用数组试了,但是好像不行啊,这个模块支持发数组吗?我的程序是这样的,请帮我看一下
发射端
#include "SPI.h"   
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"

int a;


void setup(){
Serial.begin(9600);
//Mirf.cePin=8;
//Mirf.csnPin=7;
//以上两条语句可以用来修改引脚的位置
Mirf.spi = &MirfHardwareSpi;
Mirf.init();                                 
   Mirf.setTADDR((byte *)"serv1");//TADDR是你所需要发送过去的对方的接受地址,必须长度为5个BYTE
Mirf.payload = sizeof(int);//最大的载荷好像是31         
   Mirf.config();   
}
void loop(){

   a=analogRead(A0);
   a=analogRead(A1);
      Mirf.send((byte *)&a);//强制指针类型转换 用于拆分内存中的数据 一个BYTE一个BYTE的发送

   while(Mirf.isSending())
   { }
      Serial.print(analogRead(A0));
      Serial.print("******");
      Serial.println(analogRead(A1), DEC);
   delay(3000);
         
}

接收端
#include "SPI.h"                              //24L01库文件
#include "Mirf.h"
#include "nRF24L01.h"
#include "MirfHardwareSpiDriver.h"

int data;
int words;


void setup(){   
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;         
Mirf.init();
Mirf.setRADDR((byte *)"serv1"); //
Mirf.payload = sizeof(int);         //一次性传送的数据量大小,此处为1
      Mirf.config();
}

void loop(){

                     if(Mirf.dataReady())
{                  //如果接收到数据则执行
   Mirf.getData((byte *)&data);   //接收数据
    words=data;
    words=data;
         
      Serial.print(words);
   Serial.print("******");
      Serial.println(words,DEC);
   
Mirf.rxFifoEmpty();
}

}

发射和接收的数据不一样,求指教

三公分阳光 发表于 2015-8-11 18:58:37

liuxue4503 发表于 2015-7-26 03:59 static/image/common/back.gif
两个部分:
1,先搞定通讯,主机发送什么,从机能够接收到,就OK。在此基础上做到能够发送一个传感器的数据 ...

不好意思回复晚了,一个传感器数据是可以发送和接收的,多个的话我一开始想用数组做,但是试了之后发现好像不行,你第二条固定了位数一大串地发过去,接收到以后按长度拆开这个能详细解释下吗?谢了

三公分阳光 发表于 2015-8-11 19:00:39

pzg123 发表于 2015-7-28 20:51 static/image/common/back.gif
收到数据再返回数据

/***NRF24l01针脚连接线:MISO->12; MOSI->11; SCK->13; CE->9; CSN->10***/


这个- -没看懂

liuxue4503 发表于 2015-8-11 23:52:51

三公分阳光 发表于 2015-8-11 18:58 static/image/common/back.gif
不好意思回复晚了,一个传感器数据是可以发送和接收的,多个的话我一开始想用数组做,但是试了之后发现好 ...

上面的程序我没细看,简单从发送接收数据这方面来说吧,比如,只有一个传感器的情况,在不考虑误码的情况下(发送的是什么,收到的就是什么), 直接把数据发送出去就行。如果有多个的话,就需要定义一个规则,用数组并不是指直接把数组对象发过去,是你自己在发送前,把多个传感器的值按一定的格式组合起来,然后发过去,接收端收到之后,按你定的那个“数组规则”来解开。
给个例子吧:比如现在要发送3个传感器的数据,分别是101,109,999,数组方式就是弄成:这一串,收到的时候,想办法把3个数从那一串里弄出来。这是最基本的吧,还可以加个传感器标志,更好分辨,成这样等等
我说的那个一大串的发送其实没上面这个好,要求是每个传感器数据长度一样才好弄,还拿上面那个来说,最简单的,直接发过去101109999,收到后直接拆成3个。。。。

三公分阳光 发表于 2015-8-12 00:36:34

liuxue4503 发表于 2015-8-11 23:52 static/image/common/back.gif
上面的程序我没细看,简单从发送接收数据这方面来说吧,比如,只有一个传感器的情况,在不考虑误码的情况 ...

原理明白了,但是不会写。。能不能帮忙给个例子让我参照下,十分感谢!
页: [1]
查看完整版本: 求助 关于nRF24L01的问题