Serial.read - komme nicht weiter

Ich habe folgenden Sketch auf einem Arduino UNO laufen,
der Arduiono ist mit einem WIN 10 PC per USB (USB-SERIAL Ch340) verbunden.
Mit dem Programm "Serialsend.exe" möchte ich entweder eine "1" oder eine "0" an den Arduino senden, worauf dieser je nach empfangenen Byte eine Aktion (LED) ausführt.

Der Sketch funktioniert wenn ich die "0" oder "1" vom IDE Monitor schicke, aber leider nicht wenn ich es vom PC (mit Serialsend.exe) schicke.

So sieht das Ganze aus:

// Seriell auf RX ( oder USB ) reinkommende Daten per event auslesen und das Zeilenende erkennen
// serialEvent() ist nicht kompatible mit Arduino Esplora, Leonardo oder Micro
//
// Matthias Busse 17.12.2018 Version 1.0
constexpr uint8_t LED1= 11;
constexpr uint8_t LED2= 12;

String inputString="";            // Eingabe String Daten
bool stringComplete=false;        // String abgeschlossen


void setup() {
  pinMode (LED1, OUTPUT);
  digitalWrite(LED1,LOW);         //Led 1 OFF
  pinMode (LED2, OUTPUT);
  digitalWrite(LED2,LOW);         //Led 2 OFF
  
  Serial.begin(9600);            // Baud
  inputString.reserve(64);       // 64 Byte Platz für den Seriellen Text
}

void loop() {
  if(stringComplete) {
    stringComplete=false;
    
  
    if (inputString[0] == '0'){   // SerialSend.exe /baudrate 9600 /devnum 6 "0\n" vom PC
        digitalWrite(LED1, HIGH); //Led 1 ON
        delay(1000);
        digitalWrite(LED1, LOW);  //Led 1 OFF        
    }
    
    if (inputString[0] == '1'){ // SerialSend.exe /baudrate 9600 /devnum 6 "1\n" vom PC
      digitalWrite(LED2, HIGH); //Led 1 ON
      delay(1000);
      digitalWrite(LED2, LOW);  //Led 2 OFF 
    }
    inputString="";
  }
}

void serialEvent() {
// Wird aufgerufen wenn an RX Daten angekommen sind, ausserhalb von loop().
// Ein delay() in loop() kann die Datenübernahme verzögern.
// Der Arduino RX Buffer ist standardmässig 64 Zeichen groß, kann aber ggf. vergrößert werden.
  while(Serial.available()) {        // bis alle Zeichen im RX Buffer ausgelesen sind
    char inChar=(char)Serial.read(); // ein Zeichen im RX Buffer auslesen

    if(inChar == '\n') {             // String Ende erkennen
      stringComplete=true;
    }
    else {                            // Zeichen anhängen
      inputString+=inChar; 
    }
  }
}// Seriell auf RX ( oder USB ) reinkommende Daten per event auslesen und das Zeilenende erkennen
// serialEvent() ist nicht kompatible mit Arduino Esplora, Leonardo oder Micro
//
// Matthias Busse 17.12.2018 Version 1.0
constexpr uint8_t LED1= 11;
constexpr uint8_t LED2= 12;

String inputString="";            // Eingabe String Daten
bool stringComplete=false;        // String abgeschlossen


void setup() {
  pinMode (LED1, OUTPUT);
  digitalWrite(LED1,LOW);         //Led 1 OFF
  pinMode (LED2, OUTPUT);
  digitalWrite(LED2,LOW);         //Led 2 OFF
  
  Serial.begin(9600);            // Baud
  inputString.reserve(64);       // 64 Byte Platz für den Seriellen Text
}

void loop() {
  if(stringComplete) {
    stringComplete=false;
    
  
    if (inputString[0] == '0'){   // SerialSend.exe /baudrate 9600 /devnum 6 "0\n" vom PC
        digitalWrite(LED1, HIGH); //Led 1 ON
        delay(1000);
        digitalWrite(LED1, LOW);  //Led 1 OFF        
    }
    
    if (inputString[0] == '1'){ // SerialSend.exe /baudrate 9600 /devnum 6 "1\n" vom PC
      digitalWrite(LED2, HIGH); //Led 1 ON
      delay(1000);
      digitalWrite(LED2, LOW);  //Led 2 OFF 
    }
    inputString="";
  }
}

void serialEvent() {
// Wird aufgerufen wenn an RX Daten angekommen sind, ausserhalb von loop().
// Ein delay() in loop() kann die Datenübernahme verzögern.
// Der Arduino RX Buffer ist standardmässig 64 Zeichen groß, kann aber ggf. vergrößert werden.
  while(Serial.available()) {        // bis alle Zeichen im RX Buffer ausgelesen sind
    char inChar=(char)Serial.read(); // ein Zeichen im RX Buffer auslesen

    if(inChar == '\n') {             // String Ende erkennen
      stringComplete=true;
    }
    else {                            // Zeichen anhängen
      inputString+=inChar; 
    }
  }
}

Bitte um eure Hilfe.

Danke

Josef

Sendest Du von Serialsend.exe auch '\n' mit (Zeilenvorschub / LF)?

Gruß Tommy

Ja, ich sende so:

SerialSend.exe /baudrate 9600 /devnum 4 "1\n"

Dann liegt das Problem auf dem PC, wenn Du '\n' sendest und es mit dem seriellen Monitor funktioniert. Evtl. ist die serielle Schnittstelle noch von der IDE belegt. Mache die mal zu.

Gruß Tommy

Dachte auch die IDE blockiert, aber leider ist das nicht so.

Die Com4 dürfte normal arbeiten, ich sehe auch ein kurzes Aufflackern der Serial-LED.
Aber leider kann scheinbar der Input nicht ausgewertet werden.

Ich möchte mir halt ersparen einen 2. Serialport mit einem Adapter zu installieren, da könnte ich dann am Monitor mitschauen, aber ich denke es kann ja nur eine Kleinigkeit sein, die ich übersehe.

Da Dein Sketch mit dem seriellen Monitor der IDE funktioniert, kann es nicht am Sketch liegen.
Versuche es doch mal mit einem Terminalprogramm wie hterm oder CoolTerm.

Gruß Tommy

When the “/hex” commmand line option is specified, the escape sequences “\n” and “\r” may be used to insert line feed and carriage return characters respectively. For example, the following command sends the string “Hello” followed by a carriage return and a line feed (7 bytes in total).

SerialSend.exe /hex "Hello\r\n"

Ja du hattest Recht:-), es funktioniert mit:
SerialSend.exe /baudrate 9600 /devnum 4 /hex "0\r\n"
SerialSend.exe /baudrate 9600 /devnum 4 /hex "1\r\n"

Natürlich habe ich auch den ASC-Wert von "0" = 48 und "1" = 49 ändern müssen.

Danke für eure Hilfe.

1 Like

Dann markiere Post 7 bitte als Lösung

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.