PI, Raspian, IDE, Kompilieren, nicht möglich

Hallo Community,

eine ganz allgemeine Frage. Ich bin natürlich Anfänger und finde nichts in google was zu der allgemeinen Frage passt...

Ich habe ein Sketch den sich auf einem Mac und einem Win 10 Rechner in der Arduino IDE kompilieren und hochladen lässt. Sobald ich es aber auf dem PI 4 unter Raspian in der Arduino IDE kompilieren will findet er eine Stelle in der Library die er nicht gut findet :-).

Kann es sein das der Compiler anders... beschaffen ist oder auf anderem Weg arbeitet. Oder ich mal wieder an der Linux Dateirechte Steuerung scheitere?

Ich teste gerade WLAN und daher macht der Sketch eher keinen Sinn :slight_smile:

Sketch:

//#include <printf.h>
#include <nRF24L01.h>
#include <RF24_config.h>
#include <RF24.h>

#include <SPI.h>

RF24 radio (9,8); // CE, CSN

const byte adress[6] = "00001";

const byte adressB[6] = "00002";

String TextUebern;
char textS[12];

void setup() {
 
  // put your setup code here, to run once:
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, adress);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
  pinMode(7, OUTPUT);
  
}

void loop() {
  // put your main code here, to run repeatedly:


  if (radio.available(adress)) {
    Serial.println("machIchauchA");
    char text[12] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);

    for (int i = 0; i<12; i++){
       
         textS[i] = text[i];
       }
      
    TextUebern = textS[0];   
  }
   if (radio.available(adressB)) {
    Serial.println("machIchB");
    char textB[20] = "";
    radio.read(&textB, sizeof(textB));
    Serial.println(textB);
    /*
    for (int i = 0; i<12; i++){
       
         textS[i] = text[i];
       }
      
    TextUebern = textS[0];
    */
  }
  
  if (TextUebern == "A"){

    Serial.println("mach ich");

    digitalWrite(7, HIGH);
    delay(100);
    digitalWrite(7, LOW);

    TextUebern = "x";

    }
}

Funktioniert auch ..... aber wie gesagt sobald ich kompiliere, Library ist eingebunden, kommt der Fehler:

WlanBasisEmpf.ino: In function ‘void loop()’:
WlanBasisEmpf.ino:41:29: error: invalid conversion from ‘const byte* {aka const unsigned char*}’ to ‘uint8_t* {aka unsigned char*}’ [-fpermissive]
In file included from WlanBasisEmpf.ino:6:0:
/home/pi/sketchbook/libraries/RF24/RF24.h:551:10: note:   initializing argument 1 of ‘bool RF24::available(uint8_t*)’
     bool available(uint8_t* pipe_num);
          ^
WlanBasisEmpf.ino:52:25: error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
In file included from /usr/share/arduino/hardware/arduino/cores/arduino/Arduino.h:192:0,
                 from /usr/share/arduino/libraries/SPI/SPI.h:15,
                 from WlanBasisEmpf.ino:1:
/usr/share/arduino/hardware/arduino/cores/arduino/WString.h:84:11: note:   initializing argument 1 of ‘String& String::operator=(const char*)’
  String & operator = (const char *cstr);
           ^

nun habe ich mit meinem geringen Wissen den Eindruck, dass in der Library irgendwas falsch ist, aber das kann ja nicht sein... Könnt Ihr mir nen Denkanstoß geben :slight_smile: Ja steht da ... aber ich verstehe es leider nicht.

Freundliche Grüße
Marco

freejack_:
nun habe ich mit meinem geringen Wissen den Eindruck, dass in der Library irgendwas falsch ist, aber das kann ja nicht sein...

Zunächst einmal kann es erhebliche Unterschiede geben, wie „ein- und derselbe Compiler“ zu unterschiedlichen Urteilen kommen kann. Wenn Du es pingelig genau wissen möchtest, vergleiche die exakten Versionsnummern (z.B. also nicht nur „3“, sondern „3.1.23“).

Obendrein ist es durchaus möglich, dass sich Bibliotheken zwischen Systemen unterscheiden.

Gruß

Gregor

Mach' was der Compiler vorschlägt: häng' ein "-fpermissive" an die Optionen vom GCC dran: C++ Dialect Options - Using the GNU Compiler Collection (GCC)

Grund: verschiedene Compilerversionen mit verschiedenen Defaultsettings. "char" und "uin8_t" sind zwar gleich, aber wenn die Typprüfung strenger ist, dann sind sie halt ungleich (weil sie nicht gleich heißen).

zwieblum:
Mach' was der Compiler vorschlägt: häng' ein "-fpermissive" an die Optionen vom GCC dran: C++ Dialect Options - Using the GNU Compiler Collection (GCC)

Kann man derartige Parameter/Optionen dauerhaft festnageln? In preferences.txt konnte ich auf die Schnelle nichts Derartiges finden.

Gruß

Gregor

PS: In diesem speziellen Fall sollte es doch auch genügen, die Typumwandlung explizit vorzunehmen, oder nicht?

Schau mal in arduino/hardware/arduino/avr/platform.txt

gregorss:
Zunächst einmal kann es erhebliche Unterschiede geben, wie „ein- und derselbe Compiler“ zu unterschiedlichen Urteilen kommen kann. Wenn Du es pingelig genau wissen möchtest, vergleiche die exakten Versionsnummern (z.B. also nicht nur „3“, sondern „3.1.23“).

Obendrein ist es durchaus möglich, dass sich Bibliotheken zwischen Systemen unterscheiden.

Gruß

Gregor

Danke für den Hinweis, dachte wenn Mac und Win sich verstehen :slight_smile: aber ok das hatte ich nicht beachtet und es ist so wie du schreibst, Mac = Arduino 1.8.13 und Raspian = 2:1.0.5+dfsg2-4.1

"char" und "uin8_t" sind zwar gleich

Das kann man so nicht sagen.
Im c++ Standard kann (je nach Compiler) char signed oder unsigned sein.

Der Wertebereich ist entweder 0 .. 255 oder -128..127, aber es gibt 3 Datentypen, die untereinander unterschiedlich sind. { char / signed char == int8_t / unsigned char == uint8_t }
Für Berechnungen, bei denen es auf Wertebereich/Vorzeichen ankommt, sollte man char also besser nicht verwenden.

( im Gegensatz dazu ist int übrigens definitiv signed, aber mit undefinierter Größe/Wertebereich

zwieblum:
Mach' was der Compiler vorschlägt: häng' ein "-fpermissive" an die Optionen vom GCC dran: C++ Dialect Options - Using the GNU Compiler Collection (GCC)

Grund: verschiedene Compilerversionen mit verschiedenen Defaultsettings. "char" und "uin8_t" sind zwar gleich, aber wenn die Typprüfung strenger ist, dann sind sie halt ungleich (weil sie nicht gleich heißen).

Hey super, danke zwieblum das werde ich jetzt mal versuchen. Habs mal gespeichert aber bin glaub noch nicht weit genug um das wirklich umsetzen zu können, auch wenn ich da wahrscheinlich grad aus deiner Sicht über ein Streichholz stolpere. Aber hab mir das auf die Lernliste gesetzt. Danke !!

zwieblum:
Schau mal in arduino/hardware/arduino/avr/platform.txt

sorry, das schaue ich wo? *schäm
Aber nochmal danke!!!! Vor allem so schnell und so kompetente Hilfe hatte ich bei meinem ersten Post garnicht erhofft :slight_smile:
Da ich noch sehr am Anfang stehe, werde ich erstmal auf den anderen Systemen arbeiten und den PI für später lassen :slight_smile: fand die Idee nur so schick aber als WIN und MAC Nutzer auf nen PI wechseln erfordert vom User doch mehr Wissen.
und die Hinweise habe ich mir gemerkt und gehe das nochmal an
Grüße Marco

freejack_:
sorry, das schaue ich wo? *schäm

Unter Linux liegt das dort: /home/gszaktilla/bin/arduino/hardware/arduino/avr/

Über die Suchfunktion Deines Systems sollte die Datei leicht zu finden sein.

Gruß

Gregor

PS: In platform.txt kann man das tatsächlich dauerhaft eintragen.

Grundproblem mit Arduino und RaspberryPi ist, dass die "mitgelieferte" (in den Packetquellen enthaltene) Version der Arduino-IDE meist fürchterlich alt ist. Bis vor kurzem war das noch Version 1.0.5 (aus 2013). Mittlerweile ist glaube ich es 1.6., das ist aber auch nicht besonders neu (aktuell = 1.8.13).
Ich rate dringend zu einer aktuell(er)en Version. Das Update geht aber nur indem du dir eine aktuelle Version selbst herunterlädst und über die Kommandozeile selbst installierst (es geht auch nicht über das grafische Tool, dessen Namen mir gerade nicht einfällt). Das ist kein Problem für einen eingefleischten Linux User, aber eine gewisse Hürde für einen Neueinsteiger. :slight_smile:
Details siehe z.B. hier: