Go Down

Topic: nRF24L01 with MIRF Libary often Timeouts (Read 1 time) previous topic - next topic

erf2012

Hello,

I am new in Wifiprogramming. I have an issue that I cannot unterstand. I have to Unos with a connected nRF24L01, using the MIRF Libary.

My Problem is that the connection is working and the Server Shows a connection result, but it works usally only 5 to 15 times and then the connection is impossible. If I restart the server all fine up to the disconnection. The Client has no effect if I restart them.

Here is my code:

Server:
Code: [Select]

/**
* An Mirf example which copies back the data it recives.
*
* Pins:
* Hardware SPI:
* MISO -> 12
* MOSI -> 11
* SCK -> 13
*
* Configurable:
* CE -> 8
* CSN -> 7
*
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

void setup(){
  Serial.begin(9600);
 
  /*
   * Set the SPI Driver.
   */

  Mirf.spi = &MirfHardwareSpi;
 
  /*
   * Setup pins / SPI.
   */
   
  Mirf.init();
 
  /*
   * Configure reciving address.
   */
   
  Mirf.setRADDR((byte *)"serv1");
 
  /*
   * Set the payload length to sizeof(unsigned long) the
   * return type of millis().
   *
   * NB: payload on client and server must be the same.
   */
   
  Mirf.payload = sizeof(unsigned long);
 
  /*
   * Write channel and payload config then power up reciver.
   */
   
  Mirf.config();
 
  Serial.println("Listening...");
}
int i = 0;
void loop(){
  /*
   * A buffer to store the data.
   */
   
  byte data[Mirf.payload];
 
  /*
   * If a packet has been recived.
   *
   * isSending also restores listening mode when it
   * transitions from true to false.
   */
   
  if(!Mirf.isSending() && Mirf.dataReady()){
    Serial.println("Got packet");
   
    /*
     * Get load the packet into the buffer.
     */
     
    Mirf.getData(data);
   
    /*
     * Set the send address.
     */
     
     
    Mirf.setTADDR((byte *)"clie1");
   
    /*
     * Send the data back to the client.
     */
     
    Mirf.send(data);
   
    /*
     * Wait untill sending has finished
     *
     * NB: isSending returns the chip to receving after returning true.
     */
     
    Serial.print("Reply sent: ");
    Serial.print(i);
    i++;
    Serial.println();
  } else {
    Serial.print(".");
  }
}


Here is the Client

Code: [Select]

/**
* A Mirf example to test the latency between two Ardunio.
*
* Pins:
* Hardware SPI:
* MISO -> 12
* MOSI -> 11
* SCK -> 13
*
* Configurable:
* CE -> 8
* CSN -> 7
*
* Note: To see best case latency comment out all Serial.println
* statements not displaying the result and load
* 'ping_server_interupt' on the server.
*/

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

void setup(){
  Serial.begin(9600);
  /*
   * Setup pins / SPI.
   */
   
  /* To change CE / CSN Pins:
   *
   * Mirf.csnPin = 9;
   * Mirf.cePin = 7;
   */
  /*
  Mirf.cePin = 7;
  Mirf.csnPin = 8;
  */
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
 
  /*
   * Configure reciving address.
   */
   
  Mirf.setRADDR((byte *)"clie1");
 
  /*
   * Set the payload length to sizeof(unsigned long) the
   * return type of millis().
   *
   * NB: payload on client and server must be the same.
   */
   
  Mirf.payload = sizeof(unsigned long);
 
  /*
   * Write channel and payload config then power up reciver.
   */
   
  /*
   * To change channel:
   *
   * Mirf.channel = 10;
   *
   * NB: Make sure channel is legal in your area.
   */
   
  Mirf.config();
 
  Serial.println("Beginning ... ");
}

void loop(){
  unsigned long time = millis();
 
  Mirf.setTADDR((byte *)"serv1");
 
  Mirf.send((byte *)&time);
 
  while(Mirf.isSending()){
  }
  Serial.println("Finished sending");
  delay(10);
  while(!Mirf.dataReady()){
    //Serial.println("Waiting");
    if ( ( millis() - time ) > 1000 ) {
      Serial.println("Timeout on response from server!");
      return;
    }
  }
 
  Mirf.getData((byte *) &time);
 
  Serial.print("Ping: ");
  Serial.println((millis() - time));
 
  delay(1000);
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy