Quelle est la bonne façon d'obtenir une liste de tous les ports / périphériques série disponibles sur un système Linux?
En d'autres termes, lorsque j'effectue une itération sur tous les périphériques /dev/
, comment puis-je savoir quels sont les ports série de manière classique, c'est-à-dire ceux qui prennent généralement en charge les débits en bauds et le contrôle de flux RTS / CTS ?
La solution serait codée en C.
Je demande parce que j'utilise une bibliothèque tierce qui fait clairement cela mal: il semble seulement itérer /dev/ttyS*
. Le problème est qu'il existe, par exemple, des ports série via USB (fournis par des adaptateurs USB-RS232), et ceux-ci sont répertoriés sous / dev / ttyUSB *. Et lire le Serial-HOWTO sur Linux.org , j'ai l'idée qu'il y aura aussi d'autres espaces de noms, avec le temps.
J'ai donc besoin de trouver le moyen officiel de détecter les périphériques série. Le problème est qu'aucun ne semble être documenté, ou je ne le trouve pas.
J'imagine qu'une façon serait d'ouvrir tous les fichiers /dev/tty*
et d'en appeler un spécifique ioctl()
qui n'est disponible que sur les périphériques série. Serait-ce une bonne solution, cependant?
Mettre à jour
hrickards suggéré de regarder la source de "setserial". Son code fait exactement ce que j'avais en tête:
Tout d'abord, il ouvre un appareil avec:
fd = open (path, O_RDWR | O_NONBLOCK)
Ensuite, il invoque:
ioctl (fd, TIOCGSERIAL, &serinfo)
Si cet appel ne renvoie aucune erreur, alors c'est un périphérique série, apparemment.
J'ai trouvé un code similaire dans la programmation série / termios , ce qui suggérait d'ajouter également l' O_NOCTTY
option.
Il y a cependant un problème avec cette approche:
Lorsque j'ai testé ce code sur BSD Unix (c'est-à-dire Mac OS X), cela a également fonctionné. Cependant , les périphériques série fournis via Bluetooth obligent le système (pilote) à essayer de se connecter au périphérique Bluetooth, ce qui prend un certain temps avant qu'il ne revienne avec une erreur de temporisation. Cela est dû à la simple ouverture de l'appareil. Et je peux imaginer que des choses similaires peuvent également se produire sous Linux - idéalement, je ne devrais pas avoir besoin d'ouvrir l'appareil pour déterminer son type. Je me demande s'il existe également un moyen d'invoquer des ioctl
fonctions sans ouvrir ou d'ouvrir un périphérique de manière à ne pas créer de connexions?
Que devrais-je faire?