arduino在使用nrf24l01发送信息失败-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5068|回复: 14

[未解决] arduino在使用nrf24l01发送信息失败

[复制链接]
发表于 2021-7-25 17:33 | 显示全部楼层 |阅读模式
代码如下:

  1. #include <SPI.h>
  2. #include <nRF24L01.h>
  3. #include <RF24.h>

  4. //create an RF24 object
  5. RF24 radio(7, 8);  // CE, CSN
  6. const byte address[6] = "00001";
  7. void setup()
  8. {
  9.   Serial.begin(9600);
  10.   radio.begin();
  11.   if(radio.begin()){
  12.     Serial.println("初始化完成");         
  13.   }
  14.   else{
  15.     Serial.println("初始化失败");
  16.   }
  17.   radio.setDataRate(RF24_250KBPS);
  18.   radio.setPALevel(RF24_PA_MAX);
  19.   radio.openWritingPipe(address);  
  20.   radio.stopListening();  
  21. }
  22. void loop()
  23. {
  24.   const char text[] = "Hello,World";
  25.   int i=0;
  26.   if(radio.write(&text, sizeof(text))){
  27.     Serial.println("successed");
  28.   }
  29.   else{
  30.     Serial.println("failed");
  31.   }
  32.   delay(1000);
  33. }
复制代码


代码烧录进arduino uno后,串口一直显示“failed”,就是能初始化但是radio.write(&text,sizeof(texi))这句一直是0,发送不出去。有没有大佬能帮我解答一下
 楼主| 发表于 2021-7-30 16:16 | 显示全部楼层
frankhan747 发表于 2021-7-29 17:49
有接收端早说啊
接收端为什么要运行radio.setChannel(56)?发射机代码里没有类似的操作,默认设置是set ...

抱歉抱歉,,这是我后来改的,,,最开始用的都是默认通道。。我后来看了模块配置信息,发现发送端是56,接收端是76所以就在这里设置了一下,但是还是接收不到...我最开始用的都是网上的别人成功了的代码,想先验证一下,但是一直成不了..

点评

板子、代码、模块都一样,别人的成功你的没成功,那就是硬件问题了。找卖家评理吧  发表于 2021-7-30 22:20
发表于 2021-7-26 10:11 | 显示全部楼层
我觉得坛主可以单开一个NRF24L01提问板块了
相关讨论非常非常之多
 楼主| 发表于 2021-7-26 15:22 | 显示全部楼层
frankhan747 发表于 2021-7-26 10:11
我觉得坛主可以单开一个NRF24L01提问板块了
相关讨论非常非常之多

确实我看到好多人也都遇见了各种各样的问题,,但是大多都是14,15年左右的问题,,我私信了他们也没人回复我,,我也不知道那些问题都是怎么解决的..
 楼主| 发表于 2021-7-26 15:23 | 显示全部楼层

  1. #include <Mirf.h>
  2. #include <MirfHardwareSpiDriver.h>
  3. #include <MirfSpiDriver.h>
  4. #include <nRF24L01.h>
  5. #include <SPI.h>

  6. int data=0;

  7. void setup(){
  8.   Serial.begin(9600);
  9.   //Mirf.cePin = 7;
  10.   //Mirf.csnPin = 8;
  11.   Mirf.spi=&MirfHardwareSpi;
  12.   Mirf.init();
  13.   Mirf.setTADDR((byte*)"srv02");
  14.   Mirf.payload=sizeof(int);
  15.   Mirf.config();
  16. }

  17. void loop(){
  18.   data++;
  19.   sendData();
  20.   delay(1000);
  21. }

  22. void sendData(){
  23.   Mirf.send((byte*)&data);
  24.   while(Mirf.isSending())
  25.   {
  26.     Serial.println("sending...");
  27.     delay(1000);
  28.   }
  29.   Serial.print("send data");
  30.   Serial.println(data);
  31. }
复制代码


换了Mirf库,但是又卡在while(Mirf.isSending())了...一直在发送消息,一直发送不出去..
 楼主| 发表于 2021-7-26 17:47 | 显示全部楼层
frankhan747 发表于 2021-7-26 10:11
我觉得坛主可以单开一个NRF24L01提问板块了
相关讨论非常非常之多

我看到您在很多的nrf24l01问题贴下面都有回复,,不知道您对我这个问题有何见解。我现在急切需要解决这个问题..
发表于 2021-7-26 21:45 | 显示全部楼层
LI-NG 发表于 2021-7-26 17:47
我看到您在很多的nrf24l01问题贴下面都有回复,,不知道您对我这个问题有何见解。我现在急切需要解决这个 ...

我主要用RF24库,一直都挺好的···
我碰到过的NRF问题无非这几个:
电路连接有误。CE、CSN容易接反,MOSI、MISO容易接反;
接触不良(线松了)
供电方式不对。普通版本用3.3V,带SMA的版本用5V配合转接板供电
代码句法。建议先跑例程。一楼的代码虽然不太保险,但跑是能跑。
再不行就是模块质量不合格,这种事也碰到过···
我再翻翻RF24的库文件,看看问题可能出在哪
发表于 2021-7-26 22:38 | 显示全部楼层
本帖最后由 frankhan747 于 2021-7-26 22:52 编辑

明白了,其实数据是发出去了,不过你在自己吓唬自己
先附上一个详解NRF的帖子:开贴讲讲NRF24L01P,让你彻底搞懂它的工作原理,持续更...
https://www.arduino.cn/forum.php ... 6275&fromuid=179950
(出处: Arduino中文社区)
帖子作者是alicedodo大佬
这是RF24库的write函数实现代码:
  1. bool RF24::write(const void* buf, uint8_t len, const bool multicast)
  2. {
  3.     //Start Writing
  4.     startFastWrite(buf, len, multicast);

  5.     //Wait until complete or failed
  6.     #if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
  7.     uint32_t timer = millis();
  8.     #endif // defined(FAILURE_HANDLING) || defined(RF24_LINUX)

  9.     while (!(get_status() & (_BV(TX_DS) | _BV(MAX_RT)))) { //Status register判断1
  10.         #if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
  11.         if (millis() - timer > 95) {
  12.             errNotify();
  13.             #if defined(FAILURE_HANDLING)
  14.             return 0; //1号报错点
  15.             #else
  16.             delay(100);
  17.             #endif
  18.         }
  19.         #endif
  20.     }
  21.     ce(LOW);
  22.     uint8_t status = write_register(NRF_STATUS, _BV(RX_DR) | _BV(TX_DS) | _BV(MAX_RT));
  23.     //Max retries exceeded
  24.     if (status & _BV(MAX_RT)) {  //Status register判断2
  25.         flush_tx(); //Only going to be 1 packet int the FIFO at a time using this method, so just flush
  26.         return 0; //2号报错点
  27.     }
  28.     //TX OK 1 or 0
  29.     return 1;
  30. }
复制代码

注意这两个报错点。
alicedodo在帖子里指出,NRF模块在进行半双工通信时有一个机制:如果主发射端(在发完一段数据后)没有收到主接收端的ACK应答(或数据,总之是一个响应),则会重新发送相同的数据(重试);如果这种重试达到一定次数、但主接收端仍然没有任何响应,主发送端会把这个情况上报给主控。
第一个报错点触发原因是 未接到主接收端的应答导致的等待超时;
第二个报错点的触发原因则是重试次数已达预设值,NRF判定通信失败并通过中断和Status register报错
在你的实验中,主接收端是不存在的,主发射端当然不会接收到任何应答。其实数据已经被转换成电磁波发射出去了(如果主接收端工作正常就应该能收到),但是write函数仍然会返回false,于是主程序执行Serial.println("failed");
至于具体代码解析,可以去看另外2处打中文注释的地方。NRF24L01的Status Register信息在数据手册Section 9.1,59页
另,_BV是AVR的黑话,_BV(x)等价于1<<x
如有错漏还请大佬斧正

 楼主| 发表于 2021-7-29 14:38 | 显示全部楼层
frankhan747 发表于 2021-7-26 22:38
明白了,其实数据是发出去了,不过你在自己吓唬自己
先附上一个详解NRF的帖子:开贴讲讲NRF24L01P,让 ...

我之前是有接收端的,,只是我没想到接收端也会影响发送端所以就没贴上。。接收端代码在这:

  1. #include<printf.h>
  2. #include <SPI.h>
  3. #include <nRF24L01.h>
  4. #include <RF24.h>
  5. int i=0;
  6. RF24 radio(7, 8);
  7. const byte address[6] = "00001";
  8. void setup()
  9. {
  10.   printf_begin();
  11.   while (!Serial);
  12.   Serial.begin(9600);
  13.   radio.begin();
  14.   radio.setChannel(56);
  15.   radio.setDataRate(RF24_250KBPS);
  16.   radio.openReadingPipe(0, address);
  17.   radio.startListening();
  18.   radio.printPrettyDetails();
  19. }
  20. void loop()
  21. {
  22.   if (radio.available())
  23.   {
  24.     char text[32] = {0};
  25.     radio.read(&text, sizeof(text));
  26.     Serial.println(text);
  27.   }
  28.   else
  29.   Serial.println("没有信号");
  30.   delay(1000);
  31. }
复制代码

我是接收端和发送端一起启动,,但是发送端就还是那个问题。。
发表于 2021-7-29 17:49 | 显示全部楼层
LI-NG 发表于 2021-7-29 14:38
我之前是有接收端的,,只是我没想到接收端也会影响发送端所以就没贴上。。接收端代码在这:

我是接收端 ...

有接收端早说啊
接收端为什么要运行radio.setChannel(56)?发射机代码里没有类似的操作,默认设置是setChannel(76);
这么一弄,发射机在76频道,接收机在56频道,当然通不上信了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 01:43 , Processed in 0.116253 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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