wuyanbin 发表于 2018-4-29 08:38:31

求助NRF24L01上传失败是什么原因

转载大师hxf的       http://www.geek-workshop.com/forum.php?mod=viewthread&tid=14467&highlight=nrf24l01

发送端的{
msg= int(str);   这句显示复制错误信息,求指点是什么原因
]

以下是与arduino的具体连接方式
NRF24L01 -------------- Arduino
IRQ          -------------- 悬空不接
MISO       --------------D12
MOSI       --------------D11
SCK         --------------D13
CSN         --------------D7
CE          --------------   D8
VCC      --------------   3.3V
GND      --------------GND

      (2)其次是软件问题
因为要用到ASK码表,直接给大家贴上来:

bin             dechex对应字符
01100000   48   30   0
 
00110001   49   31   1
        
00110010   50   32   2
        
00110011   51   33   3
        
00110100   52   34   4
        
00110101   53   35   5
        
00110110   54   36   6
        
00110111   55   37   7
        
00111000   56   38   8
        
00111001   57   39   9

发送端内容如下:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

char tempx="00000";
int x=0;

void setup(){
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();

Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
Mirf.channel = 3; // 通信信道

Mirf.config();
}
void loop(){
unsigned long time = millis();

Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址

if(x<10)tempx=x+48;//当x小于10时,只需要显示个位,+48正好对应ASK码数值
else if(x>9 && x<100){
tempx=x%10+48;
tempx=x/10+48;//当x大于10小于100时,需要显示个位和十位
}

Sends(tempx);
x++;
if(x==100){
x=0;
tempx=x%10+48;
tempx=x/10+48;
}

delay(500);
}


void Sends(char *str)
{
int lens;
lens=strlen(str);

char msg;
int i;
for (i=0;i<lens;i++)
{
msg= int(str);
}
Mirf.send((byte *)&msg);

while(Mirf.isSending()){}
   
}

接收内容如下:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup(){
Serial.begin(9600);

Mirf.spi = &MirfHardwareSpi;
Mirf.init();

Mirf.setRADDR((byte *)"serv1"); // 本地名
Mirf.payload = 5; // 长度
Mirf.channel = 3; // 信道

Mirf.config();

}
void loop(){

byte data;
if(!Mirf.isSending() && Mirf.dataReady()){ //存在数据

Mirf.getData(data);

int i;
String Temp;
for (i = 0; i < Mirf.payload; i++) //把收到的信息拼起来,到一个串里面
{
Temp += char(data);
}
Serial.print("Get:");
Serial.print(Mirf.payload);
Serial.print(" ");
Serial.println(Temp);

}
}


最后送上用到的库文件
Mirf.zip (12.75 KB, 下载次数: 110)



完成了第一步调试的朋友还可以尝试一下通过修改tempx值和增加一个输入口实现无线开关控制LED灯的点亮
(1)还是先来说连接方法
      作为发送信号端的arudino的D5端口接一个拨动开关(注;拨动开关一头接5v,另一头记得接地)
      作为接收信号端的arduino的D5端口接一个LED灯
(2)软件方面改动部分也给出了注释
传动内容如下:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
char tempx="00000";
int x=0;
int y=0;
void setup(){
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"clie1"); // 标记本地名,用于接收
Mirf.payload = 5; //对话的长度,用于约定双方对话的缓冲窗口大小,这个代表5个字节
Mirf.channel = 3; // 通信信道
Mirf.config();
pinMode(5,INPUT);//D五端口作为输入端
}
void loop(){
unsigned long time = millis();
Mirf.setTADDR((byte *)"serv1"); // 标记对方的地址
y=digitalRead(5);    //读取D5端口的状态
if(y==HIGH)         
{tempx=48;}//如果端口状态为高电平传送数据48
else
{tempx=49;}   //如果端口状态为低电平传送数据49
Sends(tempx);
delay(1000);
}
void Sends(char *str)
{
int lens;
lens=strlen(str);
char msg;
int i;
for (i=0;i<lens;i++)
{
msg= int(str);
}
Mirf.send((byte *)&msg);

while(Mirf.isSending()){}   
}




接收内容如下:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
int y=0;
void setup(){
Serial.begin(9600);

Mirf.spi = &MirfHardwareSpi;
Mirf.init();

Mirf.setRADDR((byte *)"serv1"); // 本地名
Mirf.payload = 5; // 长度
Mirf.channel = 3; // 信道
Mirf.config();
}
void loop(){
byte data;
if(!Mirf.isSending() && Mirf.dataReady()){ //存在数据
Mirf.getData(data);
int i;
String Temp;
for (i = 0; i < Mirf.payload; i++) //把收到的信息拼起来,到一个串里面
{
Temp += char(data);
}
Serial.print("Get:");
Serial.print(Mirf.payload);
Serial.print(" ");
Serial.println(Temp);
y=data;
Serial.println(y);
if(y==48)                        
{digitalWrite(5,HIGH);}   //接收到的数据为48,D5端口输出高电平
else if(y==49)
{digitalWrite(5,LOW);}    //接收到的数据为49,D5端口输出低电平
}
}
页: [1]
查看完整版本: 求助NRF24L01上传失败是什么原因