web-dev-qa-db-fra.com

Comment trouver le port série utilisé?

La question:

J'ai branché un appareil (c'est-à-dire un modem GSM) via un port série (alias RS-232), et j'ai besoin de voir avec quel fichier /dev/ système de fichiers auquel cet appareil a été attaché pour pouvoir communiquer avec lui. Malheureusement, il n'y a pas de fichier nouvellement créé dans /dev/ ni rien dans la sortie de dmesg. Cela semble donc être une question difficile.

Contexte:

Je n'avais jamais travaillé avec un périphérique série, donc 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.

35
Hi-Angel

Malheureusement, les ports série ne sont pas PlugNPlay, donc le noyau ne sait pas quel périphérique a été branché. Après avoir lu un HowTo tutoriel J'ai l'idée de travail.

Le répertoire /dev/ D'OS de type Unix contient des fichiers nommés ttySn (avec n étant un nombre ) . La plupart d'entre eux ne correspondent pas aux appareils existants. Pour trouver celles 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 est 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 est va avoir une tension positive sur un appareil branché. Donc, en comparant le contenu du fichier /proc/tty/driver/serial Avec et sans l'appareil branché, nous pouvons facilement trouver le ttyS lié à notre appareil. Alors, maintenant:

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

(dé) brancher un appareil

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

Vérifiez ensuite la différence entre les deux fichiers. Voici 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!

37
Hi-Angel