Comment trouver quel port série est utilisé?

33

La question:

J'ai branché un périphérique (modem GSM) via un port série (RS-232) et j'ai besoin de savoir avec quel fichier du /dev/système de fichiers cet appareil était bloqué pour pouvoir communiquer avec lui. Malheureusement, il n'y a pas de fichier nouvellement créé /dev/ni rien en dmesgsortie. Donc, cela semble être une question difficile.

Contexte:

Je n'avais jamais travaillé avec un appareil série. Hier, quand un besoin est apparu, j'ai essayé de le rechercher sur Google, mais je n'ai rien trouvé d'utile. J'ai passé quelques heures à chercher et je veux partager une réponse trouvée car elle pourrait être utile à quelqu'un.

Salut ange
la source
1
J'aime utiliser ces bits pour détecter un périphérique. Je vais probablement l'utiliser. Bien que de nombreux périphériques n'utilisent que les broches Tx / Rx, je pourrais probablement les pirater pour maintenir la ligne CTS à un niveau élevé.
Danny Staple
1
liés à stackoverflow.com/questions/2530096/…
Ciro Santilli a dévoilé

Réponses:

34

Malheureusement , les ports série sont non-plugnplay, si le noyau ne sait pas quel appareil est branché. Après avoir lu un HowTo tutoriel , j'ai eu l'idée de travailler.

Le /dev/répertoire des systèmes d'exploitation similaires à Unix contient des fichiers nommés ttySn (n étant un nombre) . La plupart d'entre eux ne correspondent pas aux appareils existants. Pour trouver ceux qui le font, lancez une commande:

$ 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

Ci-dessus, un exemple de sortie de mon PC. Vous pouvez voir l'initialisation de quelques ports série:

ttyS0, ttyS1, ttyS4, ttyS5.

L'un d'eux aura une tension positive sur un périphérique branché. Ainsi, en comparant le contenu du fichier /proc/tty/driver/serialavec et sans le périphérique branché, nous pouvons facilement trouver le ttyS associé à notre périphérique. Alors maintenant:

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

(débrancher) un appareil

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

Ensuite, vérifiez la différence entre les deux fichiers. Ci-dessous une sortie de mon 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

En comparant les trois nombres avec la sortie dmesg, nous pouvons déterminer lequel est le port:

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

Par conséquent, notre appareil est /dev/ttyS0, mission accomplie!

Salut ange
la source
1
Que faire si je ne vois aucun périphérique dans la sortie dmesg?
user3019105
2
@ user3019105 désolé, je n'ai jamais été confronté à un tel problème. D'après ce que je comprends, dmesgdevrait avoir un message sur l'affectation de irq à un périphérique série. Et si ce n'était pas le cas, je supposerais un problème matériel. C'est juste une hypothèse, et peut-être fausse, mais si je déboguais un tel problème, je commencerais la recherche en pensant que le port série aurait dû être initialisé.
Bonjour Angel
1
Depuis que je passe d'une machine à l'autre, j'ai défini un alias pour me montrer les ports série de cette machine. Cela fonctionne sur les systèmes de la famille Ubuntu avec systemd. alias ports = 'udevadm info --export-db | grep -i "^ n: ttyu"'
jour de