- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 10

Thema: einfaches Programm, simpler Fehler, aber wo?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242

    einfaches Programm, simpler Fehler, aber wo?

    Anzeige

    Powerstation Test
    Hallo,

    zuerst wünsche ich euch ein frohes neues Jahr.

    Das folgende Programmchen empfängt über die Serielle SS 2 ein "ja", das ich im Seriellen Monitor auch sehen kann.

    In dem if - Befehl soll der Ausgang 13 auf HIGH gesetzt werden. Das passiert auch, wenn der "digitalWrite(ausgang, HIGH);" außerhalb des if steht, klappt aber nicht im if.
    Mir fällt da nichts zu ein. Vielleicht erkennt jemand von euch den Fehler ja sofort.

    Danke fürs Hinschauen.

    Code:
    int ausgang = 13;
    
    String Blinken = "1";
    
    
    void setup() {
    
      Serial.begin (250000);
      while (!Serial);
      
      Serial2.begin (9600);
      while (!Serial);
      
      pinMode (ausgang, OUTPUT);
    
    }
    
    
    //                           Hier beginnt die Schleife
    void loop() {
    
      if (Serial2.available())       //   Info verfügbar?
      {
        Blinken = Serial2.readStringUntil('\n');      //   Info einlesen
      }
    
      Serial.print("Blinken  =  ");
      Serial.println(Blinken);
    
      if (Blinken == "ja") {
        digitalWrite(ausgang, HIGH);
    
     /*   delay(500);
    
        digitalWrite(ausgang, LOW);
        delay(500);     */
    
      }   //******************     ENDE   if(Blinken == "ja")   
    
    
    }   //******************     ENDE LOOP

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Hallo,

    auch ich wünsche ein frohes neues Jahr.

    Kannst du mal Blinken.length() ausgeben ? Stehen da wirklich nur 2 Zeichen drin, nicht etwa z.B. "ja\r" ?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Länge ist 3, aber welches?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Wahrscheinlich schickst du die falsche Terminierung. Im Seriellen Monitor kann man das unten rechts umstellen. Mit 'Neue Zeile' sollte es funktionieren.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Tja, das ist eine typische Fehlerquelle bei solcher Art von Empfangslogik.

    Das readStringUntil hat da diverse Nachteile:

    - es könnten noch Reste alter Daten im Empfangspuffer stehen, die dann vorne an das "ja" drankommen,

    - ein Windowszeilenumbruch besteht z.B. aus \r und \n, deswegen könnte noch das \r da drin stehen,

    - wenn man bei der Eingabe den Cursor bewegt hat oder was gelöscht hat, könnte da noch anderes reingeraten.

    Also besser mit read() jedes Zeichen einzeln einlesen, bis nichts mehr kommt, und alles wegschmeissen, was man nicht braucht.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Wenn ich die SS2 nur mit read auslese, erhalte ich hex 106, 97,13,10 das sind j, a, CR und LF.
    Das wäre ja fast plausibel, da ich das "ja" von einem anderen Arduino mit println sende. Aber das sind ja nun 4 und nicht 3 Zeichen.

    Ich bin über dieses Problem auch deshalb so erstaunt, weil ich das aus einem andern Programm genau so übernommen habe, erhalte da die SS-Signale jedoch über ein Bluetooth-Modul HC06 von einer Tablet-App.
    Geändert von fredyxx (03.01.2017 um 11:37 Uhr)

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Naja, readStringUntil('\n') liesst alle Zeichen bis '\n'. Da dies als Trennzeichen gewertet wird, wird es nicht in den Rückgabestring geschrieben.

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Ich habe das Problem nun folgendermaßen behoben:

    Blinken = Serial2.readStringUntil('\n');.....ersetzt durch.....Blinken = Serial2.readStringUntil('\r');

    und

    if (Blinken == "ja").....ersetzt durch.....if (Blinken.substring(1) == "ja").....da wird dann das erste Zeichen nicht mitgenommen.

    Danke für eure Hilfen

    Gruß

    fredyxx

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Damit liest du erst ab der zweiten 'ja'-Nachricht. Die erste wird ignoriert.
    Mach besser sowas:
    Code:
      if (Serial.available()) {
        str = Serial.readStringUntil('\n');
        str.replace("\r", "\0");
    }
    Damit löscht du das '\r' in der Nachricht, falls es vorkommt.
    Geändert von Sisor (03.01.2017 um 13:33 Uhr)

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Danke, das sind wohl die Feinheiten, die man Erfahrung nennt!!

Ähnliche Themen

  1. Antworten: 14
    Letzter Beitrag: 11.04.2013, 15:34
  2. Einfaches StatusLED Programm
    Von derwisch im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 21.06.2012, 20:09
  3. einfaches programm will nicht
    Von chineseboy im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 29.03.2010, 18:57
  4. Einfaches Programm - Denkfehler gesucht
    Von carrera1988 im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 29.02.2008, 09:50
  5. Einfaches Timing-Programm - brauche Hilfe
    Von Powell im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 23.08.2006, 21:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress