Come trovare quale porta seriale è in uso?


33

La domanda:

Ho collegato un dispositivo (ad esempio un modem GSM) attraverso una porta seriale (aka RS-232) e ho bisogno di vedere con quale file nel /dev/filesystem era collegato questo dispositivo, per poter comunicare con esso. Sfortunatamente non è presente alcun file appena creato /dev/e non è possibile visualizzare nulla dmesgnell'output. Quindi questa sembra essere una domanda difficile.

Sfondo:

Non avevo mai lavorato con un dispositivo seriale, quindi ieri, quando è apparso una necessità, ho provato a cercarlo su Google ma non ho trovato nulla di utile. Ho trascorso alcune ore in cerca e voglio condividere una risposta trovata in quanto potrebbe essere utile per qualcuno.


1
Mi piace usare quei bit per rilevare un dispositivo - probabilmente lo userò, anche se ho molti dispositivi che usano solo i pin Tx / Rx, probabilmente potrei hackerarli per mantenere alta la linea CTS.
Danny Staple,

Risposte:


34

Sfortunatamente le porte seriali non sono PlugNPlay, quindi il kernel non sa quale dispositivo è stato collegato. Dopo aver letto un tutorial su HowTo ho avuto l'idea di lavoro.

La /dev/directory di unix come i SO contiene file chiamati come ttySn (con n che è un numero) . La maggior parte di essi non corrisponde a dispositivi esistenti. Per trovare quelli che fanno, emettere un comando:

$ 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

Sopra c'è un esempio di output del mio PC. Puoi vedere l'inizializzazione di alcune porte seriali:

ttyS0, ttyS1, ttyS4, ttyS5.

Uno di questi avrà una tensione positiva su un dispositivo collegato. Quindi, confrontando il contenuto del file /proc/tty/driver/serialcon e senza il dispositivo collegato, possiamo facilmente trovare i ttyS relativi al nostro dispositivo. Quindi ora:

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

(un) collegare un dispositivo

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

Quindi controlla la differenza tra i due file. Di seguito è riportato un output del mio 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

Confrontando i tre numeri con l'output di dmesg possiamo determinare quale è la porta:

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

Quindi, il nostro dispositivo è /dev/ttyS0, missione compiuta!


1
Cosa succede se non vedo alcun dispositivo nell'output di dmesg?
user3019105

2
@ user3019105 scusate, non ho mai affrontato questo problema. Da quello che ho capito, dmesgdovrebbe avere un messaggio sull'assegnazione di irq a un dispositivo seriale. E se così non fosse, assumerei un problema hardware. Questo è solo un presupposto, e potrebbe essere sbagliato, ma se debug un tale problema, inizierei la ricerca con l'idea in mente che la porta seriale avrebbe dovuto essere inizializzata.
Hi-Angel,

1
Da quando passo da una macchina all'altra ho definito un alias per mostrarmi le porte seriali su questa macchina. Funziona su sistemi della famiglia Ubuntu con systemd. alias porte = 'udevadm info --export-db | grep -i "^ n: ttyu"'
DDay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.