Fehler mit Datentyp?



  • Hallo zusammen,
    ich habe ein Problem mit der Programmierung meines Arduinos. Ich habe folgenden Code:

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      pinMode(LED_BUILTIN, OUTPUT);
    }
    int nummer;
    
    void loop() {
      nummer = Serial.read();
    
    
      if (nummer == "15") {
        digitalWrite(LED_BUILTIN, HIGH);
      }
    
      if (nummer == "25") {
        digitalWrite(LED_BUILTIN, LOW);
      }
    
    }
    

    Dabei erhalte ich aber immer folgenden Fehler:

    G:\Arduino-Projekte\eingabe4test\eingabe4test.ino: In function 'void loop()':
    G:\Arduino-Projekte\eingabe4test\eingabe4test.ino:12:17: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
       if (nummer == "15") {
                     ^~~~
    G:\Arduino-Projekte\eingabe4test\eingabe4test.ino:16:17: warning: ISO C++ forbids comparison between pointer and integer [-fpermissive]
       if (nummer == "25") {
                     ^~~~
    
    

    Ich möchte im seriellen Monitor eine Zahl eingeben und dadurch die LED an oder ausstellen. Mit einer einstelligen Zahl habe ich es hinbekommen, aber mit einer zweistelligen geht es irgendwie nicht.

    Vielen Dank für eure Hilfe.

    P.S. Ich bin absoluter Anfänger mit Arduinos.


  • Mod

    Hat es mit einer einstelligen Zahl denn auch richtig funktioniert? Falls ja, dann macht Serial.read() nicht das, was du denkst, was es tut.

    Da das ein ziemlich offensichtlicher Anfängerfehler ist (hängt damit zusammen, welche Datentypen es in C++ gibt und wie sie funktionieren) wäre meine starke Empfehlung, wenigstens erst einmal die Grundlagen von C++ (ein paar Wochen lang) zu lernen, ohne die Verkomplizierung des Arduinos. Dann verstehst du auch die Dokumentation von Serial.read().



  • @BENNID
    "15" ist etwas ganz anderes als 15
    Und auch "1" ist etwas ganz anderes als '1' was auch nicht 1 ist.

    Du musst zwischen Strings (Zeichenketten) und Zahlen unterscheiden.

    Die Arduino-Umgebung hat sogar ihre eigene String-Klasse.



  • @SeppJ Ja mit einstelligen Zahlen hat es funtkioniert. Also statt "15" hatt ich zum Beispiel '2' stehen. Wenn ich dann 2 in den seriellen Monitor eingegeben habe, ist die LED angegangen.



  • @BENNID sagte in Fehler mit Datentyp?:

    Also statt "15" hatt ich zum Beispiel '2' stehen.

    Dass sich hier nicht nur die Anzahl der Stellen unterscheidet ist dir aber klar?



  • Warum möchtest du überhaupt mehrstellige Zahlen haben?

    Der Rückgabewert von Serial.read() ist quasi char (d.h. ASCII-Code), so daß du für mehrstellige Ziffernfolgen (z.B. '1', '5') auch mehrmals diese Funktion aufrufen mußt (was das ganze aber komplizierter macht, wenn nicht immer die gleiche Anzahl von Ziffern verarbeitet werden soll).

    PS: Der technische Rückgabewert ist zwar int, aber nur, um auch -1 (für den Fehlerfall "keine Daten") zu ermöglichen.


  • Mod

    @BENNID sagte in Fehler mit Datentyp?:

    @SeppJ Ja mit einstelligen Zahlen hat es funtkioniert. Also statt "15" hatt ich zum Beispiel '2' stehen. Wenn ich dann 2 in den seriellen Monitor eingegeben habe, ist die LED angegangen.

    Dann hast du missverstanden, was Serial.read() tut. Wenn ich mir die Dokumentation dazu angucke, kann ich durchaus nachvollziehen, wie es dazu gekommen sein kann. Ohne genau über die Basics von C++ Bescheid zu wissen, kann das durchaus unterschiedlich interpretiert werden. Daher wiederhole ich noch einmal meinen Rat, dass du lieber erst einmal die Grundlagen ohne Arduino lernst.

    Mit dem dokumentierten Verhalten von Serial.read() bist du gerade erst einmal sowieso am Ende. entweder gibt es da andere Funktionen (aber ich durchsuch nicht die API für dich danach) die machen, was du willst, oder es gibt einen anderen Eingabemodus für dein Gerät (kann ich auch nicht für dich wissen), oder du musst eigene Funktionen auf Basis von Serial.read() für mehrere Zeichen schreiben. Und letzteres übersteigt deine derzeitigen Fähigkeiten.

    Nur damit du richtig verstehst: Das Problem kommt daher, dass Zahlen, Zeichen, und Zeichenketten jeweils sehr unterschiedliche Dinge sind. Dein Serial.read() liefert das Äquivalent eines Zeichens.


Anmelden zum Antworten