Wie finde ich heraus, welche serielle Schnittstelle verwendet wird?

33

Die Frage:

Ich habe ein Gerät (z. B. ein GSM-Modem) über eine serielle Schnittstelle (alias RS-232) angeschlossen und muss sehen, mit welcher Datei im /dev/Dateisystem dieses Gerät verbunden war, um mit ihm kommunizieren zu können. Leider befindet sich keine neu erstellte Datei /dev/in der dmesgAusgabe, noch ist etwas in der Ausgabe zu sehen . Das scheint also eine schwierige Frage zu sein.

Hintergrund:

Ich hatte noch nie mit einem seriellen Gerät gearbeitet. Als gestern ein Bedarf auftrat, versuchte ich, es zu googeln, fand aber nichts hilfreiches. Ich habe ein paar Stunden auf der Suche verbracht und möchte eine gefundene Antwort mitteilen, da dies für jemanden hilfreich sein könnte.

Hallo Engel
quelle
1
Ich mag es, diese Bits zu verwenden, um ein Gerät zu erkennen - ich werde das wahrscheinlich verwenden, obwohl ich viele Geräte habe, die nur die Tx / Rx-Pins verwenden, könnte ich sie wahrscheinlich hacken, um die CTS-Leitung dafür hochzuhalten.
Danny Staple
1
related stackoverflow.com/questions/2530096/…
Ciro Santilli

Antworten:

34

Leider sind serielle Ports nicht PlugNPlay-fähig, sodass der Kernel nicht weiß, welches Gerät angeschlossen ist. Nach dem Lesen eines HowTo- Tutorials habe ich eine Idee.

Das /dev/Verzeichnis von Unix-ähnlichen Betriebssystemen enthält Dateien mit dem Namen ttySn (wobei n eine Zahl ist) . Die meisten entsprechen nicht den vorhandenen Geräten. Geben Sie einen Befehl ein, um herauszufinden, welche dieser Befehle ausgeführt werden:

$ dmesg | grep ttyS
[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2
[    0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2

Oben ist eine Beispielausgabe meines PCs. Sie können die Initialisierung einiger serieller Ports sehen:

ttyS0, ttyS1, ttyS4, ttyS5.

Einer von ihnen wird eine positive Spannung an einem angeschlossenen Gerät haben. Wenn/proc/tty/driver/serial wir also den Inhalt der Datei mit und ohne angeschlossenes Gerät vergleichen, können wir die mit unserem Gerät verbundenen ttyS leicht finden . Also machen Sie jetzt:

$ sudo cat /proc/tty/driver/serial> /tmp/1

Ein Gerät (aus) stecken

$ sudo cat /proc/tty/driver/serial> /tmp/2

Überprüfen Sie anschließend den Unterschied zwischen den beiden Dateien. Unten ist eine Ausgabe von meinem PC:

$ diff /tmp/1 /tmp/2
2c2
< 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0
---
> 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 CTS|DSR

Durch Vergleichen der drei Zahlen mit der dmesg-Ausgabe können wir feststellen, welcher der Ports ist:

[    0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Daher ist unser Gerät /dev/ttyS0, Mission erfüllt!

Hallo Engel
quelle
1
Was ist, wenn in der dmesg-Ausgabe kein Gerät angezeigt wird?
user3019105
2
@ user3019105 sorry, ich bin noch nie auf ein solches Problem gestoßen. Soweit ich weiß , dmesgsollte eine Meldung über die Zuweisung von IRQ zu einem seriellen Gerät vorliegen . Und wenn nicht, würde ich ein Hardwareproblem annehmen. Das ist nur eine Annahme und könnte falsch sein, aber wenn ich ein solches Problem beheben würde, würde ich mit der Untersuchung beginnen und bedenken, dass die serielle Schnittstelle hätte initialisiert werden müssen.
Hi-Angel
1
Seit ich von Computer zu Computer wechsle, habe ich einen Alias ​​definiert, der mir die seriellen Ports auf diesem Computer anzeigt. Es funktioniert auf Systemen der Ubuntu-Familie mit systemd. alias ports = 'udevadm info --export-db | grep -i "^ n: ttyu"'
DDay