求助 关于nRF24L01的问题
想用一块arduino板接收多个传感器数据,通过nRF24L01发送到另一块arduino板上,今天下午我也翻了很多大神的帖子,也尝试过通过一个端口像另一个端口发送数据,也成功过了。但是不知道为什么加上传感器就不行了- -现在有两个问题想向大家请教:
1.接收传感器数据的代码该怎么改?
2.如果是发送多个传感器的数据该怎么写程序?
这两个问题想了一天了,没什么思路。希望大家帮帮忙,谢谢啦 使用数组,一起发送,接收后拆分,很好用的方法!:lol 两个部分:
1,先搞定通讯,主机发送什么,从机能够接收到,就OK。在此基础上做到能够发送一个传感器的数据
2,多个数据的发送,自己定个简单的协议,或者固定了位数一大串地发过去,接收到以后按长度拆开。 本帖最后由 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();//生效配置
} 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();
}
}
发射和接收的数据不一样,求指教 liuxue4503 发表于 2015-7-26 03:59 static/image/common/back.gif
两个部分:
1,先搞定通讯,主机发送什么,从机能够接收到,就OK。在此基础上做到能够发送一个传感器的数据 ...
不好意思回复晚了,一个传感器数据是可以发送和接收的,多个的话我一开始想用数组做,但是试了之后发现好像不行,你第二条固定了位数一大串地发过去,接收到以后按长度拆开这个能详细解释下吗?谢了 pzg123 发表于 2015-7-28 20:51 static/image/common/back.gif
收到数据再返回数据
/***NRF24l01针脚连接线:MISO->12; MOSI->11; SCK->13; CE->9; CSN->10***/
这个- -没看懂 三公分阳光 发表于 2015-8-11 18:58 static/image/common/back.gif
不好意思回复晚了,一个传感器数据是可以发送和接收的,多个的话我一开始想用数组做,但是试了之后发现好 ...
上面的程序我没细看,简单从发送接收数据这方面来说吧,比如,只有一个传感器的情况,在不考虑误码的情况下(发送的是什么,收到的就是什么), 直接把数据发送出去就行。如果有多个的话,就需要定义一个规则,用数组并不是指直接把数组对象发过去,是你自己在发送前,把多个传感器的值按一定的格式组合起来,然后发过去,接收端收到之后,按你定的那个“数组规则”来解开。
给个例子吧:比如现在要发送3个传感器的数据,分别是101,109,999,数组方式就是弄成:这一串,收到的时候,想办法把3个数从那一串里弄出来。这是最基本的吧,还可以加个传感器标志,更好分辨,成这样等等
我说的那个一大串的发送其实没上面这个好,要求是每个传感器数据长度一样才好弄,还拿上面那个来说,最简单的,直接发过去101109999,收到后直接拆成3个。。。。 liuxue4503 发表于 2015-8-11 23:52 static/image/common/back.gif
上面的程序我没细看,简单从发送接收数据这方面来说吧,比如,只有一个传感器的情况,在不考虑误码的情况 ...
原理明白了,但是不会写。。能不能帮忙给个例子让我参照下,十分感谢!
页:
[1]