NRF24L01+ Struct Verständnisprobleme

Hallo,

ich erhalte diese Fehlermeldung beim Kompilieren und finde den Fehler nicht:

Arduino: 1.6.3 (Windows 7), Platine: "Arduino Nano, ATmega328"

Verwende die Bibliothek SPI im Ordner: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI 

Verwende die Bibliothek RF24 im Ordner: C:\Program Files (x86)\Arduino\libraries\RF24 (legacy)



C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10603 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\eightanaloginputs -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI -IC:\Program Files (x86)\Arduino\libraries\RF24 C:\Users\THOMAS~1\AppData\Local\Temp\build114378132786862338.tmp\Arduino_Empf_nger.cpp -o C:\Users\THOMAS~1\AppData\Local\Temp\build114378132786862338.tmp\Arduino_Empf_nger.cpp.o 

Arduino_Empf_nger.ino: In function 'void loop()':

Arduino_Empf_nger.ino:62:50: error: could not convert 'radio.RF24::read(((void*)(& myData)), ((uint8_t)sizeof (dataStruct)))' from 'void' to 'bool'

Arduino_Empf_nger.ino:62:50: error: in argument to unary !

Fehler beim Kompilieren.

Das hier ist der Sketch dazu:

#include <SPI.h>
#include "RF24.h"

/****************** User Config ***************************/
/***      Set this radio as radio number 0 or 1         ***/
bool radioNumber = 1;

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);
/**********************************************************/

byte addresses[][6] = {"1Node","2Node"};

// Used to control whether this node is sending or receiving
bool role = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("EMPFÄNGER"));
  
  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
 // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setPALevel(RF24_PA_LOW);
  
  // Open a writing and reading pipe on each radio, with opposite addresses
  if(radioNumber){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
  }else{
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
  }
  
  // Start the radio listening for data
  radio.startListening();
}

struct dataStruct{
  int temp;
  int hum;
};

void loop() { 
    
    radio.stopListening();                                    // First, stop listening so we can talk.
    
    
    Serial.println(F("Lese Struct"));
    
   dataStruct myData;


     if (!radio.read(&myData, sizeof(dataStruct) )){
       Serial.println(F("failed"));
     }
        
    radio.startListening();   

   Serial.print(myData.temp);    // Now, continue listening
   Serial.print(myData.hum);    // Now, continue listening
   delay(1000);
}

Ziel ist es später das Struct an einen Raspi zu senden. Aber ich scheitere ja schon hier...
Wenn ich nur einen Wert (Temp oder Hum) sende geht es, nur Struct will nicht

Kann mich jemand aufklären?

Bist du sicher dass die read() Funktion was zurück gibt? Die scheint void als Rückgabe-Wert zu haben. Jedenfalls laut der Fehlermeldung.

"error: in argument to unary !" zeigt auch dass es am ! Operator liegt, der selbstverständlich nicht mit void funktioniert

EDIT:
Willst du das jetzt Senden oder Empfangen? Laut Text willst du das Senden, aber der Code empfängt. Wobei das mit dem start/stopListening() eher für Senden ist.

Wenn du überprüfen möchtest ob Daten zum Lesen da sind, sollte es dafür available() geben

Hi,

nein ich möchte empfangen. Das hier ist mein Sende Sketch:

/*
* Getting Started example sketch for nRF24L01+ radios
* This is a very basic example of how to send data from one node to another
* Updated: Dec 2014 by TMRh20
*/

#include <SPI.h>
#include "RF24.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(7,8);
/**********************************************************/

byte addresses[][6] = {"1Node","2Node"};

// Used to control whether this node is sending or receiving
bool role = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("SENDER"));
  
  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
 // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setPALevel(RF24_PA_LOW);
  
  // Open a writing and reading pipe on each radio, with opposite addresses
  if(radioNumber){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
  }else{
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
  }
  
  // Start the radio listening for data
  radio.startListening();
}

struct dataStruct{
  int temp;
  int hum;
} myData;

void loop() { 
    
    radio.stopListening();                                    // First, stop listening so we can talk.
    
    
    Serial.println(F("Sende Temp"));

    int temp = 3230;                             // Take the time, and send it.  This will block until complete
    int hum = 67;
    
    myData = { 
        temp,hum};
        
    
     if (!radio.write( &myData, sizeof(myData) )){
       Serial.println(F("failed"));
     }
        
    radio.startListening();                                    // Now, continue listening
    
    // Try again 1s later
    delay(1000);
} // Loop

Ich wollte eigentlich prüfen ob mein Struct funktioniert, da ich es auch schon am Raspi Versucht habe aber da funktionierte es auch nicht.

Ich möchte später einfach per Node die Temp und Luftfeuchte senden. Das ganze bewusst als "int"

Schau dir mal das an:
http://maniacbug.github.io/RF24/GettingStarted_8pde-example.html

Da ist noch was mit einem Timeout außen rum, aber wenn du das mal ignorierst, sollte das Problem klar werden. Die Funktionen read() und write() sind nicht analog zueinander! write() gibt einen bool zurück. read() allerdings nicht. Statt dessen wird read() nur aufgerufen wenn available() wahr ist.
Und du darfst beim Empfangen natürlich nicht stopListening() machen.

Hallo nochmal zurück,

habe es hinbekommen und glaube auch verstanden wo der Fehler lag. Danke Dir für den Denkanstoß, auch wenn es bei mir ne Weile gedauert hat bis es klick gemacht hat.

Anbei der funktionierende Code

/*
* Getting Started example sketch for nRF24L01+ radios
* This is a very basic example of how to send data from one node to another
* Updated: Dec 2014 by TMRh20
*/

#include <SPI.h>
#include "RF24.h"

/****************** User Config ***************************/
/***      Set this radio as radio number 0 or 1         ***/
bool radioNumber = 1;

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);
/**********************************************************/

byte addresses[][6] = {"1Node","2Node"};

struct dataStruct{
  int temp;
  int hum;
};

// Used to control whether this node is sending or receiving
bool role = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("EMPFÄNGER"));
  
  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
 // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setPALevel(RF24_PA_LOW);
  
  // Open a writing and reading pipe on each radio, with opposite addresses
  if(radioNumber){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
  }else{
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
  }
  
  // Start the radio listening for data
  radio.startListening();
}

void loop() {

/****************** Pong Back Role ***************************/

  
    dataStruct myData;
    
    if( radio.available()){
                                                                    // Variable for the received timestamp
      while (radio.available()) {                                   // While there is data ready
        radio.read( &myData, sizeof(dataStruct) );             // Get the payload
      }
     Serial.println(F("Lese Struct")); 
     Serial.println(myData.temp);
     Serial.println(myData.hum);
   }
} // Loop

Dann noch eine kurze Frage: Irgendwie finde ich den Button für das Einfügen des Codes nicht. Also muss ich quasi immer "["code"][/"code"]" händisch einfügen. Bin der Meinung das es aber schon mal hier ging. Oder bin ich Blind?

So,

gleich ein weiteres Problem: Wenn ich vom Arduino zu Arduino sende geht es ja jetzt einwandfrei. Wenn ich aber von Arduino auf den Raspi senden möchte kommen nicht die gesendete Werte an.

Habe mir mal das "sizeof" angeschaut. Ich sende 4 und der Raspi Empfängt aber 8 :o

Und jetzt? Werde aus dem Code nicht schlau. Könntest Du mal kurz drüber schauen?

#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
#include <RF24/RF24.h>

using namespace std;

// 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);

/********** User Config *********/
// Assign a unique identifier for this node, 0 or 1
bool radioNumber = 1;

/********************************/

// Radio pipe addresses for the 2 nodes to communicate.
const uint8_t pipes[][6] = {"1Node","2Node"};

struct dataStruct{
  int temp;
  int hum;
};


int main(int argc, char** argv){

  //bool role_ping_out = true, role_pong_back = false;
  //bool role = role_pong_back;

  printf("RF24/examples/GettingStarted/\n");

  // 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();

/***********************************/
  // This simple sketch opens two pipes for these two nodes to communicate
  // back and forth.

    if ( !radioNumber )    {
      radio.openWritingPipe(pipes[0]);
      radio.openReadingPipe(1,pipes[1]);
    } else {
      radio.openWritingPipe(pipes[1]);
      radio.openReadingPipe(1,pipes[0]);
    }
	
	radio.startListening();
	
	// forever loop
	while (1)
	{
	
			// if there is data ready
			if ( radio.available() )
			{

				// Fetch the payload, and see if this was the last one.
				dataStruct myData;
				while(radio.available()){
					radio.read( &myData, sizeof(myData) );
				}
			
				printf("Got payload(%d) (%d) (%d)...\n",sizeof(myData), myData.temp, myData.hum);
				
				delay(925); //Delay after payload responded to, minimize RPi CPU time
				
			}
		

	} // forever loop

  return 0;
}

Empfangen tut er was, nur nicht das was ich sende. Wenn ich aber z.B. vom Arduino nur einen Wert sende (z.B. Temp), also kein Struct, funktioniert der Code, nur nicht in Verbindung mit dem Struct.

Sind die nicht kompatibel?

Der Code passt vom Prinzip her (nehme ich mal an). Aber Vorsicht mit sizeof() und int. Auf einem 8-Bit System ist ein int 2 Bytes groß. Auf einem 32-Bit System aber 4 Byte! 2 Byte Integer auf 32-Bit Systemen sind vom Datentyp "short"

Dann noch eine kurze Frage: Irgendwie finde ich den Button für das Einfügen des Codes nicht. Also muss ich quasi immer "["code"][/"code"]" händisch einfügen. Bin der Meinung das es aber schon mal hier ging. Oder bin ich Blind?

Das hat man doch jetzt endlich mal besser gemacht :slight_smile:
Vorher war das hinter einer komischen Schriftrolle versteckt. Jetzt ist es ganz links </>

Hi, und nochmals Danke. Man, dabei könnte es manchmal so leicht sein.....

Jetzt funktioniert es auch mit dem Raspi. Super :slight_smile:

Hatte ich echt nicht gedacht das man da auch aufpassen muss. :confused:

Aber jetzt geht's und das beste: wieder was gelernt :slight_smile:

Es ist leicht. Du musst nur deine Datentypen beherrschen :slight_smile:

Und int ist nun mal immer Plattform-abhängig. Das hast du auch zwischen Uno und Due