Jak znaleźć używany port szeregowy?


33

Pytanie:

Podłączyłem urządzenie (tj. Modem GSM) przez port szeregowy (inaczej RS-232) i muszę sprawdzić, z jakim plikiem w /dev/systemie plików to urządzenie było powiązane, aby móc się z nim komunikować. Niestety nie ma nowo utworzonego pliku /dev/ani nie widać niczego w dmesgdanych wyjściowych. To wydaje się trudne pytanie.

Tło:

Nigdy nie pracowałem z urządzeniem szeregowym, więc wczoraj, gdy pojawiła się taka potrzeba, próbowałem to zrobić w Google, ale nie znalazłem nic pomocnego. Spędziłem kilka godzin w poszukiwaniu i chcę podzielić się znalezioną odpowiedzią, ponieważ może być komuś pomocna.


1
Lubię używać tych bitów do wykrywania urządzenia - prawdopodobnie tego użyję, chociaż mam wiele urządzeń, które używają tylko pinów Tx / Rx, prawdopodobnie mógłbym je zhakować, aby utrzymać linię CTS wysoko w tym celu.
Danny Staple

Odpowiedzi:


34

Niestety porty szeregowe nie obsługują PlugNPlay, więc jądro nie wie, które urządzenie zostało podłączone. Po przeczytaniu samouczka HowTo wpadłem na pomysł.

/dev/Katalog UNIX jak poniekąd zawiera pliki o nazwach jak ttySn (gdzie n jest liczbą) . Większość z nich nie odpowiada istniejącym urządzeniom. Aby dowiedzieć się, które z nich działają, wydaj polecenie:

$ 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

Powyżej znajduje się przykładowe wyjście mojego komputera. Możesz zobaczyć inicjalizację kilku portów szeregowych:

ttyS0, ttyS1, ttyS4, ttyS5.

Jedno z nich będzie miało dodatnie napięcie na podłączonym urządzeniu. Więc porównując zawartość pliku /proc/tty/driver/serialz podłączonym urządzeniem i bez niego, możemy łatwo znaleźć ttyS związane z naszym urządzeniem. Więc teraz:

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

(od) podłącz urządzenie

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

Następnie sprawdź różnicę między dwoma plikami. Poniżej znajduje się wyjście mojego komputera:

$ 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

Porównując trzy liczby z wyjściem dmesg, możemy ustalić, który z nich jest portem:

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

Dlatego nasze urządzenie jest /dev/ttyS0, misja zrealizowana!


1
Co się stanie, jeśli nie zobaczę żadnego urządzenia na wyjściu dmesg?
user3019105

2
@ user3019105 przepraszam, nigdy nie spotkałem się z takim problemem. Z tego co rozumiem, dmesgpowinienem otrzymać komunikat o przypisaniu IRQ do urządzenia szeregowego. A jeśli nie, przypuszczam, że mam problem ze sprzętem. To tylko założenie i może się mylić, ale gdybym debugował taki problem, zacząłem badania z myślą, że port szeregowy powinien zostać zainicjowany.
Cześć Angel

1
Od czasu przejścia z komputera na komputer zdefiniowałem alias, który pokazuje mi porty szeregowe na tym komputerze. Działa na systemach rodziny Ubuntu z systememd. alias porty = 'informacja udevadm --export-db | grep -i "^ n: ttyu"'
DDay
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.