极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12218|回复: 8

求助 关于nRF24L01的问题

[复制链接]
发表于 2015-7-24 21:41:01 | 显示全部楼层 |阅读模式
想用一块arduino板接收多个传感器数据,通过nRF24L01发送到另一块arduino板上,今天下午我也翻了很多大神的帖子,也尝试过通过一个端口像另一个端口发送数据,也成功过了。但是不知道为什么加上传感器就不行了- -
现在有两个问题想向大家请教:
1.接收传感器数据的代码该怎么改?
2.如果是发送多个传感器的数据该怎么写程序?
这两个问题想了一天了,没什么思路。希望大家帮帮忙,谢谢啦
回复

使用道具 举报

发表于 2015-7-25 11:41:55 | 显示全部楼层
使用数组,一起发送,接收后拆分,很好用的方法!
回复 支持 反对

使用道具 举报

发表于 2015-7-26 03:59:56 | 显示全部楼层
两个部分:
1,先搞定通讯,主机发送什么,从机能够接收到,就OK。在此基础上做到能够发送一个传感器的数据
2,多个数据的发送,自己定个简单的协议,或者固定了位数一大串地发过去,接收到以后按长度拆开。
回复 支持 反对

使用道具 举报

发表于 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[16]={0};

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

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

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

    delay(50);//延时


    ////NRF24l01发送数据
    char server[10]={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[10]={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
使用数组,一起发送,接收后拆分,很好用的方法!

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

int a[2];


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[0]=analogRead(A0);
   a[1]=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[2];
int words[2];


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[0]=data[0];
    words[1]=data[1];
         
      Serial.print(words[0]);
     Serial.print("******");  
      Serial.println(words[1],DEC);  
     
Mirf.rxFifoEmpty();
  }

}

发射和接收的数据不一样,求指教
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-11 18:58:37 | 显示全部楼层
liuxue4503 发表于 2015-7-26 03:59
两个部分:
1,先搞定通讯,主机发送什么,从机能够接收到,就OK。在此基础上做到能够发送一个传感器的数据 ...

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

使用道具 举报

 楼主| 发表于 2015-8-11 19:00:39 | 显示全部楼层
pzg123 发表于 2015-7-28 20:51
收到数据再返回数据

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

这个- -没看懂
回复 支持 反对

使用道具 举报

发表于 2015-8-11 23:52:51 | 显示全部楼层
三公分阳光 发表于 2015-8-11 18:58
不好意思回复晚了,一个传感器数据是可以发送和接收的,多个的话我一开始想用数组做,但是试了之后发现好 ...

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

使用道具 举报

 楼主| 发表于 2015-8-12 00:36:34 | 显示全部楼层
liuxue4503 发表于 2015-8-11 23:52
上面的程序我没细看,简单从发送接收数据这方面来说吧,比如,只有一个传感器的情况,在不考虑误码的情况 ...

原理明白了,但是不会写。。能不能帮忙给个例子让我参照下,十分感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 01:44 , Processed in 0.054547 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表