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


    设计思路

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

    树莓派初始化为接收模式,接收到数据后立即切换为发送模式,超过一定时间为接收到数据则切换为发送模式,发送数据后立即切换为接收模式。

    代码实现

    Arduino Leonardo代码

    如下:

    #include <SPI.h>
    #include "RF24.h"
    #include <SPI.h>
    #include "RF24.h"
    #include <printf.h>
    /****************** User Config ***************************/
    /***      Set this radio as radio number 0 or 1         ***/
    bool radioNumber = 0;
    
    /* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
    RF24 radio(9,10);
    /**********************************************************/
    
    byte addresses[][6] = {"1Node","2Node"};
    
    // Used to control whether this node is sending or receiving
    bool role = 1;//1表示发送模式,0表示接收模式
    unsigned long start_time = micros();
    
    //这个是我们即将建立的传输渠道编码
    //!!要和另一个模块的一致
    const uint64_t pipes = 0xE8E8F0F0E1LL;
     
    //这个变量会保持我们接受到的信息
    //变量类型一定要和传过来的一样
    //要传输的数据
    unsigned long sendData = 1;
    unsigned long head = 0x01000000;//高8位为头标志,根据标志不同区分不同发送源,0x00为中心主节点
    unsigned long receData;
    
    void setup() {
      pinMode(13,OUTPUT);//指示灯
      Serial.begin(57600);
      printf_begin();
      Serial.println(F("RF24/examples/GettingStarted"));
      
      radio.begin();
    
      radio.setPALevel(RF24_PA_MAX);
      radio.openWritingPipe(pipes);
      
    }
    
    void loop() {
       Serial.print("role:");
       Serial.println(role);
      if(role){
         unsigned long data = sendData+head;
         Serial.print("Sending:");
         Serial.println(data);
         digitalWrite(13,HIGH);
         bool ok = radio.write(&data,sizeof(unsigned long));
    
         
           role = 0; 
    radio.openReadingPipe(1,pipes); radio.startListening(); start_time
    = micros(); } if(!role){ digitalWrite(13,LOW); if(radio.available()){ radio.read(&receData,sizeof(unsigned long)); Serial.print("Response:"); Serial.println(receData); role = 1; radio.stopListening();
    radio.openWritingPipe(pipes); }
    else{ unsigned long end_time = micros(); if((end_time-start_time)>=1000){ role = 1; radio.stopListening();
    radio.openWritingPipe(pipes); } } } }
    // Loop

    树莓派代码

    如下:

    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <unistd.h>
    #include <RF24/RF24.h>
    
    using namespace std;
    //
    // Hardware configuration
    // Configure the appropriate pins for your connections
    
    /****************** Raspberry Pi ***********************/
    
    // Radio CE Pin, CSN Pin, SPI Speed
    // See http://www.airspayce.com/mikem/bcm2835/group__constants.html#ga63c029bd6500167152db4e57736d0939 and the related enumerations for pin information.
    
    // Setup for GPIO 22 CE and CE0 CSN with SPI Speed @ 4Mhz
    //RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ);
    
    // NEW: Setup for RPi B+
    //RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ);
    
    // Setup for GPIO 15 CE and CE0 CSN with SPI Speed @ 8Mhz
    //RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
    
    // RPi generic:
    RF24 radio(22,0);
    
    /*** RPi Alternate ***/
    //Note: Specify SPI BUS 0 or 1 instead of CS pin number.
    // See http://tmrh20.github.io/RF24/RPi.html for more information on usage
    
    //RPi Alternate, with MRAA
    //RF24 radio(15,0);
    
    //RPi Alternate, with SPIDEV - Note: Edit RF24/arch/BBB/spi.cpp and  set 'this->device = "/dev/spidev0.0";;' or as listed in /dev
    //RF24 radio(22,0);
    
    
    /****************** Linux (BBB,x86,etc) ***********************/
    
    // See http://tmrh20.github.io/RF24/pages.html for more information on usage
    // See http://iotdk.intel.com/docs/master/mraa/ for more information on MRAA
    // See https://www.kernel.org/doc/Documentation/spi/spidev for more information on SPIDEV
    
    // Setup for ARM(Linux) devices like BBB using spidev (default is "/dev/spidev1.0" )
    //RF24 radio(115,0);
    
    //BBB Alternate, with mraa
    // CE pin = (Header P9, Pin 13) = 59 = 13 + 46 
    //Note: Specify SPI BUS 0 or 1 instead of CS pin number. 
    //RF24 radio(59,0);
    
    /********** User Config *********/
    // Assign a unique identifier for this node, 0 or 1
    bool radioNumber = 1;
    bool role = 0;//receive mode
    unsigned long  start_time=millis();
    unsigned long count=0;
    /********************************/
    
    // Radio pipe addresses for the 2 nodes to communicate.
    const uint64_t pipes = 0xE8E8F0F0E1LL;
    
    unsigned long  receData;
    unsigned long  respData=0x01;
    unsigned long  head=0x00000000;
    int main(int argc, char** argv){
    
      cout << "RF24/examples/GettingStarted/
    ";
    
      // Setup and configure rf radio
      radio.begin();
      // optionally, increase the delay between retries & # of retries
      radio.setRetries(15,15);
      // Dump the configuration of the rf unit for debugging
      radio.printDetails();
      
      radio.openReadingPipe(1,pipes);
    /***********************************/
      // This simple sketch opens two pipes for these two nodes to communicate
      // back and forth.
    
      radio.startListening();
    
      cout << "Listening .... 
    ";
      // forever loop
      while (1)
      {
      // Pong back role.  Receive each packet, dump it out, and send it back
      //
        if(!role){
            if(radio.available()){
                count++;
                radio.read(&receData,sizeof(unsigned long));
                printf("Get Data:size(%d),count(%lu) %lu 
    ",sizeof(unsigned long),count,receData);
                role = 1;
                radio.stopListening();
    radio.openWritingPipe(pipes); }
    else{ unsigned long end_time = millis(); if((end_time-start_time)>=1000){ role = 1; radio.stopListening();
    radio.openWritingPipe(pipes); } } }
    if(role){ unsigned long data = respData + head; radio.write(&data,sizeof(unsigned long)); printf("Send Data:size(%d),%lu ",sizeof(unsigned long),data); role = 0; radio.startListening();
    radio.openReadingPipe(1,pipes); start_time
    = millis(); } } // forever loop return 0; }

     

  • 相关阅读:
    Netty解决粘包和拆包问题的四种方案
    springboot 1.4 CXF配置
    聊聊springboot2的embeded container的配置改动
    MFC函数——CWnd::OnCreate
    《开发专家 Visual C 开发入行真功夫》笔记
    MFC中UpdateData()函数的使用
    Visual Studio 2008 添加MScomm控件的方法
    Visual Studio 2008 调试运行Bug记录
    《VS2010/MFC编程入门教程》——读书笔记
    《C++程序设计教程——给予Visual Studio 2008》读书笔记3章
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/8440095.html
Copyright © 2020-2023  润新知