Die UART-Baudrate kann über "screen" konfiguriert werden, nicht jedoch über "stty"

1300
Dmitry Grigoryev

Ich habe einen USB-zu-Seriell-Adapter, der auf dem CH340G- Chip basiert . Es ist mit einem Gerät verbunden, das periodisch einen String mit 9600 Baud sendet. Ich scheine jedoch in der Lage zu sein, die Daten unabhängig von der Konfiguration des UART mit stty(Version 8.13) zu erhalten:

# stty -F /dev/ttyUSB0 9600  # stty -F /dev/ttyUSB0  speed 9600 baud; line = 0; kill = ^H; min = 100; time = 2; -icrnl -imaxbel -opost -onlcr -isig -icanon -echo # stdbuf -i0 -o0 cat /dev/ttyUSB0 data data data ^C # stty -F /dev/ttyUSB0 115200 # stty -F /dev/ttyUSB0  speed 115200 baud; line = 0; kill = ^H; min = 100; time = 2; -icrnl -imaxbel -opost -onlcr -isig -icanon -echo # stdbuf -i0 -o0 cat /dev/ttyUSB0  data data data ^C 

Ich vermute stty, da stimmt etwas nicht, da screenwie erwartet funktioniert. screen /dev/ttyUSB0 9600zeigt die Daten, während screen /dev/ttyUSB0 115200keine Ausgabe erfolgt.

Gibt es etwas, was mir beim Versuch fehlt, die UART-Baudrate zu konfigurieren stty?

0

1 Antwort auf die Frage

2
sawdust

Ich vermute, da stimmt etwas nicht stty...
...
Gibt es etwas, was mir beim Versuch fehlt, die UART-Baudrate mit stty zu konfigurieren?

Ja, Ihr Test ist fehlerhaft, so dass Sie nicht feststellen, dass die Baudrate geändert wurde.

Einige (möglicherweise unklare) Fakten:

  • Eine serielle Schnittstelle könnte überhaupt keine Daten empfangen, wenn die Daten mit einer gegenüber ihrer Konfiguration sehr langsamen Baudrate gesendet werden (z. B. bei 9600 Baud und Empfangen bei 115200 Baud).
  • Der Befehl cat hat eine Eigenheit, die dazu führen kann, dass er keine Stdio-Puffer löscht, wenn er auf ein Zeilenendezeichen stößt. IOW-aufeinanderfolgende cat- Befehle könnten dieselben Daten anzeigen, wenn keine Leitungsbeendigung erfolgt ist. Die akzeptierte Antwort auf diese Frage spielt auf dieses Problem an.

Ihre spezielle Wahl und Reihenfolge der Shell-Befehle führen zusammen zu einem falschen Ergebnis.

# Stty -F / dev / ttyUSB0 9600
# stty -F / dev / ttyUSB0
# cat / dev / ttyUSB0
Daten Daten Daten
^ C

Sie konfigurieren also das serielle Terminal mit der richtigen Baudrate und empfangen einige Daten.

# Stty -F / dev / ttyUSB0 115200
# stty -F / dev / ttyUSB0
# cat / dev / ttyUSB0
Daten Daten Daten
^ C

Nach der Neukonfiguration mit einer viel schnelleren Baudrate erkennt der serielle Port möglicherweise keine gültigen Frames mehr, und es werden keine neuen Daten empfangen.
Wenn Sie einen anderen cat- Befehl ausgeben, werden dieselben Daten angezeigt, die zuvor empfangen wurden (dh vor der Änderung der Baudrate).


Nachtrag

Sie sollten sich zumindest davon überzeugen können, dass der Befehl stty nicht fehlerhaft ist und die Baudrate wie erwartet ändert.
Entweder:

Antwort: Wechseln Sie nicht zu einer sehr schnellen Baudrate (die keine Rahmen erkennen kann), sondern zu moderaten 38400 Baud oder langsameren 4800 Baud. Beides sollte den Empfang / die Anzeige von Speicherzeichen (anstelle von gültigen Daten oder nichts) bewirken.

Oder

B. Vertauschen Sie die Reihenfolge der Baudraten. Setzen Sie die Systeme, und verwenden Sie stty die schnelle, ungültige Baudrate konfigurieren zunächst verursachen entweder Empfang / Anzeige der Garbage Collection - Zeichen oder nichts.
Verwenden Sie dann stty, um die richtige Baudrate zu konfigurieren, und beginnen Sie mit dem erwarteten Empfang der Daten.

Danke, aber ich habe eine Leitungsbeendigung (denken Sie beispielsweise an Daten, die NMEA-Zeichenfolgen sind), und selbst wenn ich dies nicht tun würde, würde Zeilenpufferung "cat" daran hindern, überhaupt Daten anzuzeigen. Ich kann mir nicht vorstellen, was "cat" dazu bringen könnte, die alten Daten anzuzeigen, da vor dem Öffnen des Geräts kein Puffer zum Speichern dieser Daten vorhanden ist. Dmitry Grigoryev vor 7 Jahren 0
Ich habe einen neuen Test durchgeführt, der hoffentlich Pufferprobleme ausschließt. Dmitry Grigoryev vor 7 Jahren 0
Ihre Frage fasziniert mich, weil ich letzte Woche bei der Verwendung eines USB-zu-Seriell-Adapters und eines ** cat ** -Befehls auf ähnliche "veraltete Daten" -Probleme gestoßen bin. Anscheinend habe ich keine korrekte Erklärung und konnte sie nicht reproduzieren. Aber siehe den Nachtrag oben. sawdust vor 7 Jahren 0
Vielen Dank! Ich werde ein paar andere [UART-Adapter] (http://arduino.stackexchange.com/q/32035/13327) testen, wenn ich sie bekomme, aber Sie haben mir eine Idee gegeben: Ich werde meinen Test mit einem neuen Test wiederholen Arduino ist darauf programmiert, einen seriellen Eingang an den Ausgang zu senden. Dmitry Grigoryev vor 7 Jahren 0