在我的项目里,树莓派主要作为中心节点,用于接收数据,Arduino作为子节点,用于发送数据,考虑到以后会有很多子节点,但又不至于使得代码过于繁琐,因此所有的传输数据添加一个头部编号用于区分不同节点。

nrf24l01支持的数据最大为4个字节,因此使用最高位的一个字节(8位)作为节点编号,剩余三个字节用于传输数据。以下为具体代码:

Arduino Leonardo程序

主要用于发送数据给树莓派,同时接收树莓派的响应数据。

  1. #include <SPI.h>
  2. #include "RF24.h"
  3. #include <SPI.h>
  4. #include "RF24.h"
  5. #include <printf.h>
  6. /****************** User Config ***************************/
  7. /*** Set this radio as radio number 0 or 1 ***/
  8. bool radioNumber = ;
  9.  
  10. /* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
  11. RF24 radio(,);
  12. /**********************************************************/
  13.  
  14. byte addresses[][] = {"1Node","2Node"};
  15.  
  16. // Used to control whether this node is sending or receiving
  17. bool role = ;
  18.  
  19. //这个是我们即将建立的传输渠道编码
  20. //!!要和另一个模块的一致
  21. const uint64_t pipes = 0xE8E8F0F0E1LL;
  22.  
  23. //这个变量会保持我们接受到的信息
  24. //变量类型一定要和传过来的一样
  25. //要传输的数据
  26. unsigned long sendData = ;
  27. unsigned long head = 0x01000000;//高8位为头标志,根据标志不同区分不同发送源,0x00为中心主节点
  28. unsigned long receData;
  29.  
  30. void setup() {
  31. Serial.begin();
  32. printf_begin();
  33. Serial.println(F("RF24/examples/GettingStarted"));
  34.  
  35. radio.begin();
  36.  
  37. radio.setPALevel(RF24_PA_MAX);
  38. radio.openWritingPipe(pipes);
  39.  
  40. }
  41.  
  42. void loop() {
  43. unsigned long data = sendData+head;
  44. Serial.print("Sending:");
  45. Serial.println(data);
  46. bool ok = radio.write(&data,sizeof(unsigned long));
  47.  
  48. if(ok){
  49. radio.startListening();
  50. delay(); //延时,用于响应返回时间
  51. if(radio.available()){
  52. radio.read(&receData,sizeof(unsigned long));//读取的数据为1时,表示正常
  53. Serial.print("Response:");
  54. Serial.println(receData);
  55. }
  56. radio.stopListening();
  57. }
  58.  
  59. } // Loop

结果如下:

  

树莓派程序

树莓派主要用于接收数据,同时发出响应。

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <unistd.h>
  6. #include <RF24/RF24.h>
  7.  
  8. using namespace std;
  9. //
  10. // Hardware configuration
  11. // Configure the appropriate pins for your connections
  12.  
  13. /****************** Raspberry Pi ***********************/
  14.  
  15. // Radio CE Pin, CSN Pin, SPI Speed
  16.  
  17. // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz
  18. //RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ);
  19.  
  20. // NEW: Setup for RPi B+
  21. //RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);
  22.  
  23. // Setup for GPIO 15 CE and CE0 CSN with SPI Speed @ 8Mhz
  24. //RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
  25.  
  26. // RPi generic:
  27. RF24 radio(,);
  28.  
  29. /*** RPi Alternate ***/
  30. //Note: Specify SPI BUS 0 or 1 instead of CS pin number.
  31. // See http://tmrh20.github.io/RF24/RPi.html for more information on usage
  32.  
  33. //RPi Alternate, with MRAA
  34. //RF24 radio(15,0);
  35.  
  36. //RPi Alternate, with SPIDEV - Note: Edit RF24/arch/BBB/spi.cpp and set 'this->device = "/dev/spidev0.0";;' or as listed in /dev
  37. //RF24 radio(22,0);
  38.  
  39. /****************** Linux (BBB,x86,etc) ***********************/
  40.  
  41. // Setup for ARM(Linux) devices like BBB using spidev (default is "/dev/spidev1.0" )
  42. //RF24 radio(115,0);
  43.  
  44. //BBB Alternate, with mraa
  45. // CE pin = (Header P9, Pin 13) = 59 = 13 + 46
  46. //Note: Specify SPI BUS 0 or 1 instead of CS pin number.
  47. //RF24 radio(59,0);
  48.  
  49. /********** User Config *********/
  50. // Assign a unique identifier for this node, 0 or 1
  51. bool radioNumber = ;
  52.  
  53. /********************************/
  54.  
  55. // Radio pipe addresses for the 2 nodes to communicate.
  56. const uint64_t pipes = 0xE8E8F0F0E1LL;
  57.  
  58. unsigned long receData;
  59. unsigned long respData=0x01;
  60. unsigned long head=0x00000000;
  61. int main(int argc, char** argv){
  62.  
  63. cout << "RF24/examples/GettingStarted/\n";
  64.  
  65. // Setup and configure rf radio
  66. radio.begin();
  67. // optionally, increase the delay between retries & # of retries
  68. radio.setRetries(,);
  69. // Dump the configuration of the rf unit for debugging
  70. radio.printDetails();
  71.  
  72. radio.openReadingPipe(,pipes);
  73. /***********************************/
  74. // This simple sketch opens two pipes for these two nodes to communicate
  75. // back and forth.
  76.  
  77. radio.startListening();
  78.  
  79. cout << "Listening .... \n";
  80. // forever loop
  81. while ()
  82. {
  83. // Pong back role. Receive each packet, dump it out, and send it back
  84. //
  85.  
  86. // if there is data ready
  87. if ( radio.available() )
  88. {
  89.  
  90. // Fetch the payload, and see if this was the last one.
  91. while(radio.available()){
  92. radio.read( &receData, sizeof(unsigned long) );
  93. }
  94. radio.stopListening();
  95. unsigned long data = respData+head;
  96. radio.write( &data, sizeof(unsigned long) );
  97.  
  98. // Now, resume listening so we catch the next packets.
  99. radio.startListening();
  100.  
  101. // Spew it
  102. printf("Got payload(%d) %lu...\n",sizeof(unsigned long), receData);
  103.  
  104. delay(); //Delay after payload responded to, minimize RPi CPU time
  105.  
  106. }
  107.  
  108. } // forever loop
  109.  
  110. return ;
  111. }

结果如下:

上图中数据“16777217”用八进制表示为“0x01000001”,第一个字节的0x01表示从节点head=0x01000000发来的数据,数据为data=0x000001。

 

 

树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (二) 发送自定义数据的更多相关文章

  1. 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (六) 树莓派查询子节点温湿度数据

    nrl24l01每次只能发送4个字节,前面说到,第一个字节用于源节点,第二个字节用于目的节点.因此只剩下两个字节用于温度和湿度,一个字节只有八位,需要表示温湿度的正负数,因此每个字节的第一位表示正负符 ...

  2. 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (五) 树莓派单子节点发送数据

    本项目中各个节点和树莓派的通信不区分信道,因此如果由树莓派发送给特定节点的数据会被所有节点接收到,因此子节点可以判别该数据是否发给自己的,需要在数据的第二个字节中加入目标节点的编号(第一个字节为源节点 ...

  3. 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (三) 全双工通信

    设计思路 Arduino Leonardo初始化为发送模式,发送完成后,立即切换为接收模式,不停的监听,收到数据后立即切换为发送模式,若超过一定时间还为接收到数据,则切换为发送模式. 树莓派初始化为接 ...

  4. 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (四) 树莓派单子节点查询

    考虑到项目的实际需要,树莓派作为主机,应该只在需要的时候查询特定节点发送的数据,因此接收到数据后需要根据头部判断是否是自己需要的数据,如果不是继续接收数据,超过一定时间未查询到特定节点的数据,则退出程 ...

  5. 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (一) 配置与测试

    引脚连接说明 与树莓派的连线 NRF24L01 => 树莓派 GND          =>   GND VCC          =>    3.3V CE           = ...

  6. STC8H开发(五): SPI驱动nRF24L01无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  7. nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)

    俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经 ...

  8. [51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

    哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过 ...

  9. nRF24L01无线模块笔记

    nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据 ...

随机推荐

  1. 【转】在发布站点前,Web开发者需要关注哪些技术细节

    转摘:http://www.csdn.net/article/2014-05-19/2819818-technical-details-programmer 在网站发布前,开发者需要关注有许多的技术细 ...

  2. 20155307刘浩《网络对抗》逆向及Bof基础

    20155307刘浩<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会回显任何用户输 ...

  3. TCP/IP协议、HTTP协议

    一.序: TCP/IP协议是程序开发的基础知识,我们都知道它可以实现不同计算机之间的通信,它是什么意思?怎么实现通信的? 二.TCP/IP协议: (1)协议:约定 (2)tcp/ip:tcp是传输控制 ...

  4. PostgreSQL的 PITR实战---运用 recovery_target_time

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页     回到顶级页面:PostgreSQL索引页 看了很多的例子,没有发现具体讲 recove ...

  5. Influxdb配置文件详解---influxdb.conf

    官方介绍:https://docs.influxdata.com/influxdb/v1.2/administration/config/ 全局配置 1 2 reporting-disabled =  ...

  6. salt-api https连接问题

    在非salt-api的主机上测试api连通性,测试代码如下: #!/usr/bin/env python import pycurl import StringIO import ssl ssl._c ...

  7. Kubernetes集群部署篇( 一)

    K8S集群部署有几种方式:kubeadm.minikube和二进制包.前两者属于自动部署,简化部署操作,我们这里强烈推荐初学者使用二进制包部署,因为自动部署屏蔽了很多细节,使得对各个模块感知很少,非常 ...

  8. Cocos2dx源码赏析(2)之渲染

    Cocos2dx源码赏析(2)之渲染 这篇,继续从源码的角度来跟踪下Cocos2dx引擎的渲染过程,以此来梳理下Cocos2dx引擎是如何将精灵等元素显示在屏幕上的. 从上一篇对Cocos2dx启动流 ...

  9. shell之arp命令

    arp: 显示所有的表项. arp -d address: 删除一个arp表项. arp -s address hw_addr: 设置一个arp表项.   常用参数: -a 使用bsd形式输出.(没有 ...

  10. Python基础_异常处理与跟踪

    异常的种类 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块或 ...