Problem mit Serial.readString()

Hallo zusammen, ich möchte gerne ein Gerät nach dessen Status abfragen. Angeschlossen ist es an Serial1.

Mögliche Antworten auf die Anfrage PWR? lauten :PWR=0,:PWR=1

Mein Code:

void loop()
{
  Serial1.println("PWR?"); //Status abfragen

  String s = Serial1.readString();
  Serial.println(s);
  
  delay(5000);
}

Die Antworten die ich erhalte sehen aber ganz anders aus:

PWR=‚j:
PWR=0j:
PWRO‚j:
PWª‚‚
:
P•Õ‚0
ç
P•Õ‚‚j:
P•Õ‚0
ç
PWR=0j:
PWRO‚j:
PWR=00Cç
PWR=0j:
P•Õ‚0
ç
PWR=‚j:
PWR=00Cç
PWª‚‚
:
PWRO‚j:
PWª‚‚
:
PWª‚‚
:
PWª‚‚
:
P•Õ‚0
ç
PWR=‚j:
PWR=‚j:
PWRO‚j:
PWª‚‚
:
P•Õ‚‚j:
PWR=‚j

Hat jemand eine Idee was hier nicht passt?

Gruß Thorsten

Die Baudrate? Die GND Verbindung? Die Einlesemethode (lesen bevor die Nachricht angekommen ist)?

Kann ich den 50:50 Joker nehmen? :)

ElEspanol: Kann ich den 50:50 Joker nehmen? :)

Nein, den hatte ich nachmittags schon. Es bleibt Dir nur die Zuschauerfrage. ;) ;)

Grüße Uwe

Whandall: Die Baudrate? Die GND Verbindung? Die Einlesemethode (lesen bevor die Nachricht angekommen ist)?

Guten Morgen,

GND und Baudrate habe ich geprüft. Wegen der Einlesemethode bin ich nicht ganz sicher was Du meintest.

Ich bin etwas weiter als gestern. Scheinbar scheint die Übertragung nur in eine Richtung gestört zu sein, denn sende ich Kommandos an mein Gerät, tritt das gewünschte Verhalten auch ein.

Kann hier ein MAX232N schuld sein? Dieser ist noch dazwischen nach dieser Beschaltung (IC7). Aber wie gesagt, generell scheint die Übertragung vom Arduino zum Gerät korrekt zu sein. Der Rückweg aber nicht.

Viele Grüße Thorsten

Wie lange ist denn die Verbindungsleitung und welchen Typ Leitung benutzt du?

Es ist ein 0-Modelkabel und 2m lang.

eclere:  String s = Serial1.readString();  Serial.println(s);    delay(5000); }

Meine drei Gedanken: 1.) Serial1 gibt es gar nicht bei allen Arduino-Boards, ein UNO hat beispielsweise kein Serial1.

Welches Arduino-Board verwendest Du?

2.) Wie ist das Timingverhalten Deines Geräts, also wie schnell nach dem Senden der Anforderung kommt die Antwor zurückt? Innerhalb einer Sekunde? Oder innerhalb von fünf Sekunden?

3.) Und warum sendest Du die vom Gerät erhaltene Antwort wieder an das Gerät zurück. WOZU dient das?

Deine loop-Logik sieht doch so aus: - Sende die Anforderung an das Gerät - Lies die Rückantwort vom Gerät - warte fünf Sekunden "busy waiting" und blockiere den Controller solange für andere Aufgaben Warum diese loop-Programmlogik?

zu 1) Ich verwende das Arduino Mega Board. Dies hat 4 serielle Schnittstellen zu 2) Ich hab nachgelesen. 3 Sekunden sind es. Dennoch kommt ähnliches wie oben zurück.

Serial1.println("PWR?"); //Status abfragen
  delay(3000);
  String s = Serial1.readString();
  Serial.println(s);

zu 3) Ich befürchte da hast Du eine "1" übersehen. Ich schicke über Serial1 einen Befehl an das Gerät und sende die Antwort über Serial(ohne 1) an den PC damit ich das Ergebnis überprüfen kann.

Das wiederholte Senden und Empfangen dient eigentlich nur zum Prüfen ob die Antwort immer die gleiche ist und ob RX und TX auch nicht vertauscht ist. So konnte ich dies schnell prüfen. Wenn später die Schaltung stimmt, will ich natürlich nur einmal den Status abfragen.

eclere: GND und Baudrate habe ich geprüft. Wegen der Einlesemethode bin ich nicht ganz sicher was Du meintest.

Die Baudraten behältst du für dich, na ja, ist ja auch dein Problem.

  Serial1.println("PWR?"); //Status abfragen

  String s = Serial1.readString();

Du stopftst sechs Zeichen in den Ausgabe*puffer*, und wartest eine Sekunde auf eine Antwort (glaube ich jedenfalls, ich habe mit den blockierenden Hobby-Eingabemethoden nichts am Hut, weil meine Programme möglichst nicht blockieren).

Zum Zeitpunkt des Aufrufs von readString ist dein "PWR?\r\n" sicher noch nicht übertragen, wahrscheinlich ist sogar noch das 'P' auf dem Weg.

Whandall: Die Baudraten behältst du für dich, na ja, ist ja auch dein Problem.

Ach so...9600 :-[

Ich vergrößere mal die Wartezeit nach PWR?\r\n

Ungeachtet deines momentanen Problems:

benutze keine Strings benutze auf den Serial Schnittstellen zum Einlesen nur available() und read() benutze kein delay()

(das gilt für normale Arduinos einschließlich des Megas)

Also ich habe das Problem erkannt. Um dahinter zu kommen habe ich das Beispiel SerialPaththrough, welches zufällig auch genau meiner Anschlusskonfiguration entspicht, auf das Board geladen. Ich musste nur die Enter-Eingabe der Console durch (char)13 tauschen, da mein Gerät das so erwartet.

In der Doku von meinem Gerät steht bei Standby würde ich nach Senden vom PWR? die Antwort PWR=00 erhalten. Das stimmt aber nicht. Im Standby bekomme ich nur so Kauderwelch wie bereits gepostet. Starte ich hingegen das Gerät, kommen dann auch tatsächlich die erwarteten Werte zurück.

Zu meiner Ehrenrettung muss ich aber sagen dass es sich um einen Projektor handelt, und ich den nicht Stundenlang laufen lassen wollte :-[

Danke für die Unterstützung