求助:ESP32加NRF24L01如何接收数据?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3091|回复: 10

[未解决] 求助:ESP32加NRF24L01如何接收数据?

[复制链接]
发表于 2021-7-23 12:04 | 显示全部楼层 |阅读模式
发送接收双方即终端和基站都用ESP32配NRF24L01,下面程序是要求终端上报自己ID号,基站根据多个终端的ID号,进行点名,终端收到数据发现是自己号码,就上报自己号码,表示自己正常,不发送的说明有故障。如下是部分程序:
先看基站程序:(部分关于要求终端上报ID的程序)
// for(int k=0;k<1;k++){//循环开始

    uint8_t data[14] = {14,13,12,11,10,9,8,7,m1,m2,m3,m4,m5,1};//五位ID号拆分成五个个位数发送
    nrf24.send(data, sizeof(data));
for(int h=0;h<14;h++)
{
  Serial.print(data[h]);
Serial.print(", ");
}
Serial.println(" ");   
  nrf24.waitPacketSent();
delay(100);
// 接收
    uint8_t data1[14];
  uint8_t len = sizeof(data1);
    nrf24.recv(data1, &len);
//   Serial.print("data1[13]=");
//     Serial.println(data1[13]);

            for (int h = 0;h<14;h++){
    Serial.print(data1[h]);
     Serial.print(",");
      }


  if(buf[0]==2){
   buf8=buf[8]*10000;
   buf9=buf[9]*1000;
   buf10=buf[10]*100;
   buf11=buf[11]*10;
   buf12=buf[12];
   bufx=buf8+buf9+buf10+buf11+buf12;
    Serial.print(bufx);   
    Serial.println(" ok");
          client.print(bufx);
           client.print("OK  ");           
  }

在看终端程序:(部分关于收到要求自己上报ID号后进行上报ID的程序)

    uint8_t buf[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    uint8_t len = sizeof(buf);
    if (nrf24.recv(buf, &len))
    {
      //      NRF24::printBuffer("request: ", buf, len);
      red = buf[0];
      grn = buf[1];
      blu = buf[2];
      dur = buf[3];
      itv = buf[4];
      fois = buf[5];
      Ahour = buf[6];
      Aminute = buf[7];
      Asecond = buf[8];
      ComHor = buf[9];
      ComMin = buf[10];
      ArsHor = buf[11];
      ArsMin = buf[12];
      FFmount = buf[13];
      //上报自己是否正常程序,下面是检查是否收到 {14,13,12,11,10,9,8,7,6,5,4,3,2,1},如果最后一个值是1,说明基站要求上报自己是否正常。下面是程序段,收到这个值就发送2。

  if ((FFmount==1)&&(ArsMin==e)&&(ArsHor==d)&&(ComMin==c)&&(ComHor==b)&&(Asecond==a))
  //    if (FFmount == 1)
      {

        //循环开始
       for (int h = 0; h < 2; h++) {

       uint8_t data1[14];
       //= {2, 2, 2, 2, 2, 2, 2, 2, a, b, c, d, e, 2};上报格式

       data1[0]=2;
           data1[1]=2;
               data1[2]=2;
                   data1[3]=2;
                       data1[4]=2;
                           data1[5]=2;
                               data1[6]=2;
                                   data1[7]=2;
                                       data1[8]=a;
                                           data1[9]=b;
                                               data1[10]=c;
                                                   data1[11]=d;
                                                       data1[12]=e;
                                                           data1[13]=2;



          nrf24.send(data1, sizeof(data1));//上报自己ID
          nrf24.waitPacketSent();
          delay(20);
       }
Serial.print("*****");
  //     Serial.print(nrf24.send(data1, sizeof(data1)));
   Serial.print("*****");

          for (int h = 0;h<14;h++){
    Serial.print(data1[h]);
     Serial.print(",");
      }
      Serial.print("");  


    //    }
        //循环结束
        Serial.println("ALL OK...");
        //       Serial.println(FFmount);

      }


上述程序中,终端已经收到基站要求自己上报,并且进行了上报,现在问题是,上报了自己ID号,但是基站收到的都是一串0.
请问各位大侠,问题出在哪?


 楼主| 发表于 2021-7-24 10:56 | 显示全部楼层
就没有人能帮我吗?
 楼主| 发表于 2021-7-24 10:59 | 显示全部楼层
本帖最后由 fangtao 于 2021-7-24 11:53 编辑

我们南京疫情严重,出去不便,但这个工作又比较着急,请高手们帮帮我!忘了说了,我用的NRF24L01库是RH_NRF24.h,这个库网上资料较少,请问高手,这个库接收和发射需要语句转换吗?
发表于 2021-7-24 22:59 | 显示全部楼层
本帖最后由 frankhan747 于 2021-7-24 23:04 编辑

库没用过,只能给个思路了。
问题应该出在nrf24的收发操作上。调用nrf24.send()和nrf24.recv()这俩函数的时候,输入参数的个数、类型、顺序是否正确。具体方法是:打开RH_NRF24.h(和RH_NRF24.cpp),查看send函数、recv函数的声明和实现,检查参数表的参数类型和顺序,对照自己写的程序找错误。
比如。
nrf24.send(data, sizeof(data)); //你的代码
根据经验,这种首地址+字节数背后的操作一般是“从某某地址开始往后处理多少字节的数据”。data确实是数组的首地址这没错,但sizeof(data)是取data这个指针变量的长度(字节数),这就不对了。既然你知道data数组是14个uint8_t,一个uint8_t就是1字节,总长度就是14,而不是什么sizeof(data)二者毫不相干
nrf24.recv(data1, &len); //还是你的代码
同理。data1是地址没错。但“变量len的地址”和“数组data1的字节数”有半毛钱关系?
程序这种东西,你骗它它就骗你。

点评

你说这是正经工作我是不信的:lol。不说别的,这种写码风格就离谱。哪有数组元素逐个手动赋值的?  发表于 2021-7-24 23:01
 楼主| 发表于 2021-7-24 23:44 | 显示全部楼层
本帖最后由 fangtao 于 2021-7-24 23:50 编辑
frankhan747 发表于 2021-7-24 22:59
库没用过,只能给个思路了。
问题应该出在nrf24的收发操作上。调用nrf24.send()和nrf24.recv()这俩函数的时 ...

感谢您的回复!你说这不是正经工作,那就错了,只能说我不是正经程序员,我是做科研的,年龄又比较大了,早年编过程序,还是Quick basic 年代编过程序。手头有这个东西非要用程序实现,周围又找不到学arduino的程序员,没办法呀,这两个函数,我找到了接口文档,请你百忙之中看一下。data和data1都是数据内容,不是地址。文档在此:
http://www.airspayce.com/mikem/arduino/RadioHead/classRH__NRF24.html
1.jpg
2.jpg
发表于 2021-7-25 11:05 | 显示全部楼层
本帖最后由 frankhan747 于 2021-7-25 11:07 编辑
fangtao 发表于 2021-7-24 23:44
感谢您的回复!你说这不是正经工作,那就错了,只能说我不是正经程序员,我是做科研的,年龄又比较大了, ...

就拿源代码(RH_NRF24.cpp)里这几段来说事吧:
  1. bool RH_NRF24::send(const uint8_t* data, uint8_t len)
  2. {
  3.     if (len > RH_NRF24_MAX_MESSAGE_LEN)
  4.         return false;
  5. //后略
复制代码

第一行参数表uint8_t* data,有星号说明data是指针,没有星号才是数据内容;data指针指向uint8_t型数据,本质上是内存里的某个地址,这个地址对应的寄存器存有第1个待发数据
  1. bool RH_NRF24::recv(uint8_t* buf, uint8_t* len)
  2. {
  3.     if (!available())
  4.         return false;
  5.     if (buf && len)
  6.     {        
  7.         // Skip the 4 headers that are at the beginning of the rxBuf
  8.         if (*len > _bufLen-RH_NRF24_HEADER_LEN)
  9.             *len = _bufLen-RH_NRF24_HEADER_LEN;
  10.         memcpy(buf, _buf+RH_NRF24_HEADER_LEN, *len);
  11. //后略
复制代码

此处同理,buf是指针而不是数据内容;len居然也是指针,虽然很莫名其妙但也无妨。
不过要注意,send和recv这两个动作已经内嵌了头4位数据的处理,主程序无需再做一次
另,这种实施层面的工作可以考虑交给专门的研发工程师做,省心很多
发表于 2021-7-25 11:20 | 显示全部楼层
根据库文件和一楼的代码,我没看出什么致命的问题(至少在调用函数这块)。不过还是建议把sizeof(data)换成14,保险一点。
至于后续的排错,个人建议先把库里附带的例程跑一下,先传输一些简单的数据。把NRF这个部件调通以后再考虑怎么植入整个系统
 楼主| 发表于 2021-7-27 10:20 | 显示全部楼层
好的,谢谢您!!根据您的提示我再琢磨一下!
发表于 2021-7-27 11:23 | 显示全部楼层
去查一下ESP32的引脚  部分引脚只支持输出 不支持输出的  这个要注意一下!
 楼主| 发表于 2021-8-1 13:31 | 显示全部楼层
ahua7336 发表于 2021-7-27 11:23
去查一下ESP32的引脚  部分引脚只支持输出 不支持输出的  这个要注意一下!

这个都没问题的,谢谢提醒!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-29 01:30 , Processed in 0.104644 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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