Woher kennt cat die Baudrate der seriellen Schnittstelle?

24

Ich sehe regelmäßig catDebugging-Informationen von meinem FPGA-Entwicklungsboard über die serielle Verbindung in der Konsole an, musste aber Linux nie mitteilen, wie hoch die Baudrate ist. Woher weiß cat, wie hoch die Baudrate der seriellen Verbindung ist?

Stanri
quelle
Sie haben den Port zB mit minicomvorher nicht eingerichtet ? Hier funktioniert es nicht. Erst nachdem ich die Parameter der seriellen Schnittstelle eingerichtet habe, kann ich sie verwenden cat.
Marco
Es stellt die Baudrate nicht ein oder kennt sie nicht, es liest nur vom Gerät.
Ulrich Dangel
@Marco, ich weiß nicht, ob Debian eine Standardeinstellung für die Baudrate hat, aber ich habe sie nirgends eingestellt.
Stanri

Antworten:

34

Das sttyDienstprogramm legt die E / A-Eigenschaften des Terminals für das Gerät fest, das als Standardeingabe dient, oder meldet diese. Diese Eigenschaften werden beim Herstellen einer Verbindung über dieses bestimmte Medium verwendet. catkennt die Baudrate nicht als solche, sondern druckt die von der jeweiligen Verbindung empfangenen Informationen auf den Bildschirm.

Als Beispiel stty -F /dev/ttyACM0wird die aktuelle Baudrate für das ttyACM0-Gerät angegeben.

Stanri
quelle
1
aber woher wusste stty dann von der Baudrate? Diese Antwort verschiebt nur irgendwie die Frage, ob die Baudrate automatisch erkannt werden kann oder irgendwann (dh über stty) eingestellt wurde
humanityANDpeace
@humanityANDpeace Ich gehe davon aus, dass die Standard-Baudrate diejenige war, die ich gerade verwendet habe. Ich musste es später über stty ändern, als ich die Baudrate auf dem Gerät änderte.
Stanri
9

catVerwendet nur die Einstellungen, für die der Port bereits konfiguriert ist. Mit diesem kleinen C-Snippet können Sie die aktuell für einen bestimmten seriellen Port eingestellte Baudrate anzeigen:

get-baud-rate.c

#include <termios.h>
#include <unistd.h>
#include <stdio.h>

int main() {
  struct termios tios;
  tcgetattr(0, &tios);
  speed_t ispeed = cfgetispeed(&tios);
  speed_t ospeed = cfgetospeed(&tios);
  printf("baud rate in: 0%o\n", ispeed);
  printf("baud rate out: 0%o\n", ospeed);
  return 0;
}

Starte es:

./get-baud-rate < /dev/ttyS0 # or whatever your serial port is

Die Zahlen, die Sie erhalten, können nachgeschlagen werden /usr/include/asm-generic/termios.h, wo es #definesolche wie z. B. gibt B9600. Beachten Sie, dass die Zahlen in der Header-Datei und in der get-baud-rateAusgabe in Oktalform vorliegen.

Vielleicht können Sie experimentieren und sehen, wie diese Zahlen bei einem neuen Boot aussehen und ob sie sich später ändern.

klappern
quelle
2
Ich habe gerade den sttyBefehl gefunden, der genau das tut. Zum Beispiel, stty -F /dev/ttyACM0gibt mir die aktuelle Baudrate, die für mein Gerät korrekt ist.
Stanri
Das ist natürlich eine viel bessere Idee.
Klackern