26 votes

Y a-t-il un moyen d'accéder à un port série USB par l'identifiant du périphérique, et non par le port tty.*?

Sous linux, les périphériques USB-série créent deux alias vers leur port série :
/dev/tty* et /dev/serial/by-id/

Existe-t-il un moyen sur OSX d'identifier un port série par l'ID du périphérique USB ? Dans System Profiler et en utilisant ioreg -p IOUSB je peux voir l'ID, mais cela ne m'aide pas à me connecter en utilisant cet ID.

Nous sommes en train de développer plusieurs pièces de matériel et c'est pénible de les tester car à chaque fois que je connecte un périphérique différent, je dois vérifier la configuration du port série du logiciel de test, car sur OSX le nom du port tty.* dépend du port sur mon ordinateur, pas du périphérique. Les personnes utilisant linux utilisent avec bonheur le port /dev/serial/by-id/ pour distinguer automatiquement les différents périphériques.

9voto

Chuck Burgess Points 8060

En fait, vous devriez pouvoir trouver la correspondance entre l'ID de périphérique/numéro de série et le nom du port série en utilisant ioreg. Essayez cette commande :

ioreg -r -c IOUSBHostDevice -l

Elle affichera tous les périphériques hôtes USB, et elle affichera toutes les propriétés de chaque périphérique. Vous devriez pouvoir trouver votre périphérique au niveau supérieur en fonction de son ID ou de son numéro de série. Une fois que vous l'avez trouvé, vous devriez pouvoir parcourir son arborescence, et finalement trouver un objet de classe IOSerialBSDClient. Celui-ci contiendra la propriété IODialinDevice que vous recherchez.

Si vous voulez ensuite faire cela de manière programmée, vous pouvez ajouter l'option -a à la commande ioreg, qui produira une version plist de la sortie ci-dessus. Vous pouvez ensuite l'analyser avec une bibliothèque telle que plistlib.

Vous trouverez peut-être utile d'utiliser l'application IORegistryExplorer pour visualiser cela, car la sortie complète de ioreg est légèrement difficile à lire ! Elle est disponible dans le package "Hardware IO Tools" de XCode que vous pouvez trouver en recherchant les téléchargements sur le site des développeurs Apple. Voici à quoi cela ressemble sur mon appareil :

Exemple de IORegistryExplorer

2 votes

Veuillez noter que IORegistryExplorer.app est désormais regroupé dans un fichier .dmg appelé "Outils supplémentaires pour Xcode", toujours à la même URL.

5voto

gmale Points 3252

According to my experience, this problem comes from the driver of your serial to uart device. normally you should be able to access the serial port using

ls /dev/tty*.* 

and this is the only way to do it. But if your mac does not show it, i installed a program called serial detect, and it detected my board, otherwise use lusb before and after connecting the board, if you don't have it, install it as follows

brew install lsusb 

according to my device, i needed the following driver, for my mac 10.13

https://www.silabs.com/community/interface/knowledge-base.entry.html/2017/01/10/legacy_os_softwarea-bgvU

once installed, you can find it by

ls /dev/tty*.*

now you can flash your device or open the serial port. You can access the usb device using the device id using dfu-util, in my case 1d50:6017 is the device id shown in lsusb, i used it for flashing a blackmagic probe but you can flash what you want, dfu-util is a free utility can be installed with brew install --build-from-source dfu-util

dfu-util -d 1d50:6017 -s 0x08002000:leave -D ./src/blackmagic.bin

2 votes

Il n'y a plus moyen pour moi de faire des tests sur ce problème car le projet a été achevé il y a de nombreuses années et je ne travaille plus à temps plein dans le développement matériel. Mais comme je l'ai noté dans mon message initial, l'identifiant du périphérique dépendait directement du port de mon ordinateur portable, et non du matériel branché. J'ai deux ports USB-A et chaque fois que je connectais un dispositif en développement, je devais vérifier la configuration du logiciel de test/fonctionnement personnalisé pour m'assurer qu'il avait le bon identifiant pour communiquer avec le périphérique.

2voto

chrstphrchvz Points 266

Pour un pont FTDI que j'ai, le numéro de série apparaît déjà dans le nom du périphérique : il apparaît comme /dev/serial/by-id/usb-FTDI_FT231X_USB_UART_DA00AG57-if00-port0 (correspondant à /dev/ttyUSBx) sur Linux, et comme /dev/cu.usbserial-DA00AG57 et /dev/tty.usbserial-DA00AG57 sur macOS. (Voir https://stackoverflow.com/a/8632603/4896937 pour la différence entre tty.* et cu.*.)

Malheureusement, pour le pont Prolific que j'ai, un problème comme le vôtre s'applique toujours : un périphérique apparaissant comme /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0 (qui ne contient pas de numéro de série) est simplement /dev/cu.usbserial et /dev/tty.usbserial sur macOS (même le System Profiler ne donne pas de numéro de série pour cela). Qui sait ce qui se passerait si j'en branchais un deuxième.

Peut-être qu'il y a une réponse plus générale là-bas qui est indépendante du vendeur, mais soyez avertis que certains périphériques pourraient ne pas signaler un numéro de série.

0 votes

Pour moi, ils apparaissent sous /dev/tty.usbmodemFD121 et /dev/tty.usbmodemFA131. Le numéro dépend directement du port USB sur mon ordinateur portable. Les informations système affichent l'identifiant correct des appareils définis par leur firmware. Les deux séries sont créées par les processeurs STM32F2/F4.

1voto

adroste Points 111

J'ai utilisé la sortie de ioreg et ajouté quelques analyses avec perl pour produire un csv des ports série par rapport aux informations usb (comme VID, PID, SN).

ioreg -r -c IOUSBHostDevice -x -l | perl -ne 'BEGIN {print "Numéro de série USB,idProduit,idVendeur,Périphérique IOCallout\n"} /"Numéro de série USB" = "(.+)"/ && ($sn=$1); /"idProduit" = (.+)/ && ($ip=$1); /"idVendeur" = (.+)/ && ($iv=$1); /"Périphérique IOCallout" = "(.+)"/ && print "$sn,$ip,$iv,$1\n"'

Exemple de sortie:

Numéro de série USB,idProduit,idVendeur,Périphérique IOCallout
123456,0x1234,0xaabb,/dev/cu.usbmodem1234561
987654,0xabcd,0xaabb,/dev/cu.usbmodem9876542
000001,0x4321,0xccdd,/dev/cu.usbmodem0000013

Cette sortie peut facilement être analysée ou utilisée en conjonction avec grep pour trouver le périphérique désiré et le port série.

Explication:

  • ioreg -r -c IOUSBHostDevice -x -l liste les périphériques hôtes usb, utilisez -x pour une sortie en hexadécimal
  • perl -ne pour analyser la sortie de ioreg, -n itère sur la sortie ligne par ligne, -e exécute la commande spécifiée
  • BEGIN {print "Numéro de série USB,idProduit,idVendeur,Périphérique IOCallout\n"} affiche l'en-tête du csv
  • /"Numéro de série USB" = "(.+)"/ && ($sn=$1); correspond à un modèle et stocke la valeur capturée dans une variable $sn
  • /"idProduit" = (.+)/ && ($ip=$1); /"idVendeur" = (.+)/ && ($iv=$1); similaire à ci-dessus
  • /"Périphérique IOCallout" = "(.+)"/ && print "$sn,$ip,$iv,$1\n" chaque fois qu'il y a une ligne contenant IOCalloutDevice, nous savons que nous traitons un port série (vous pourriez changer cela en IODialinDevice pour tty au lieu de cu). Affichez le port série et les dernières informations usb stockées (qui viennent toujours avant dans la sortie ioreg) sous forme de ligne délimitée par des virgules.

0voto

alallema Points 11

J'ai eu le même problème avec Profilic Bridge et j'ai téléchargé le pilote depuis http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41 cela a résolu le problème après le redémarrage.

1 votes

Quel était le problème? L'OP a demandé comment identifier un appareil, il n'est pas question de problèmes de pilote.

0 votes

Voici la bonne réponse, j'ai beaucoup cherché

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X