26 votos

¿Existe alguna forma de acceder a un puerto serie USB mediante el ID del dispositivo, y no por el puerto tty.*?

En linux los dispositivos USB-serie crean dos alias para su puerto serie:
/dev/tty* y /dev/serial/by-id/

¿Existe alguna manera en OSX de identificar un puerto serie por el id del dispositivo USB? Tanto en el System Profiler como al usar ioreg -p IOUSB puedo ver el id, pero eso no me acerca más a conectar usando ese id.

Estamos desarrollando varias piezas de hardware y es un dolor de cabeza probarlas ya que cada vez que conecto un dispositivo diferente necesito verificar la configuración del puerto serie del software de prueba, porque en OSX el nombre del puerto tty.* depende del puerto en mi computadora, no en el dispositivo. Los que utilizan linux están felizmente usando el puerto /dev/serial/by-id/ para distinguir automáticamente entre los diferentes dispositivos.

9voto

Chuck Burgess Puntos 8060

Actualmente, deberías ser capaz de encontrar la correspondencia del ID de dispositivo/número de serie al nombre del puerto serie usando ioreg. Intenta este comando:

ioreg -r -c IOUSBHostDevice -l

Imprimirá todos los dispositivos host USB, y mostrará todas las propiedades del subárbol de cada dispositivo. Deberías ser capaz de encontrar tu dispositivo en el nivel superior basado en su ID o número de serie. Una vez lo hayas encontrado, deberías ser capaz de escanear su subárbol, y eventualmente encontrar un objeto de clase IOSerialBSDClient. Esto contendrá la propiedad IODialinDevice que es lo que buscas.

Si luego quieres hacer esto programáticamente, podrías agregar la opción -a al comando ioreg, que mostrará una versión plist de la salida anterior. Luego podrías analizar esto con una librería como plistlib.

Puede resultarte útil usar la aplicación IORegistryExplorer para ayudarte a visualizar esto, ¡ya que la salida completa de ioreg es un poco difícil de leer! Esta está disponible en el paquete "Hardware IO Tools" de XCode que puedes encontrar buscando en las descargas del sitio web de desarrolladores de Apple. Así es como se ve en mi dispositivo:

Ejemplo de IORegistryExplorer

2 votos

Por favor, ten en cuenta que IORegistryExplorer.app ahora está incluido en un .dmg llamado "Additional Tools for Xcode", todavía en la misma URL.

5voto

gmale Puntos 3252

Según mi experiencia, este problema proviene del controlador de su dispositivo serie a uart. Normalmente debería poder acceder al puerto serie usando

ls /dev/tty*.* 

y esta es la única forma de hacerlo. Pero si su Mac no lo muestra, instalé un programa llamado serial detect, y detectó mi placa, de lo contrario use lusb antes y después de conectar la placa, si no lo tiene, instálelo de la siguiente manera

brew install lsusb 

según mi dispositivo, necesitaba el siguiente controlador, para mi Mac 10.13

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

una vez instalado, puedes encontrarlo con

ls /dev/tty*.*

ahora puedes flashear tu dispositivo o abrir el puerto serie. Puedes acceder al dispositivo usb utilizando el id del dispositivo con dfu-util, en mi caso 1d50:6017 es el id de dispositivo mostrado en lsusb, lo usé para flashear una sonda blackmagic pero puedes flashear lo que quieras, dfu-util es una utilidad gratuita que se puede instalar con brew install --build-from-source dfu-util

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

2 votos

No hay forma para mí de hacer pruebas sobre este problema más, ya que el proyecto fue terminado hace muchos años y ya no me dedico al desarrollo de hardware a tiempo completo. Pero como mencioné en mi publicación original, el identificador del dispositivo dependía directamente del puerto en mi laptop, no del hardware que estaba conectado. Tengo dos puertos USB-A y cada vez que conectaba un dispositivo en desarrollo, tenía que revisar la configuración personalizada del software de pruebas/operación construido para asegurarme de que tuviera el identificador correcto para comunicarse con el dispositivo.

2voto

Para un puente FTDI que tengo, el número de serie ya aparece en el nombre del dispositivo: aparece como /dev/serial/by-id/usb-FTDI_FT231X_USB_UART_DA00AG57-if00-port0 (correspondiente a algún /dev/ttyUSBx) en Linux, y como /dev/cu.usbserial-DA00AG57 y /dev/tty.usbserial-DA00AG57 en macOS. (Ver https://stackoverflow.com/a/8632603/4896937 para la diferencia entre tty.* y cu.*.)

Desafortunadamente, para el puente Prolific que tengo, un problema como el tuyo aún se aplica: un dispositivo que aparece como /dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller-if00-port0 (que no contiene un número de serie) simplemente es /dev/cu.usbserial y /dev/tty.usbserial en macOS (ni siquiera el System Profiler proporciona un número de serie para él). Quién sabe qué pasaría si tuviera otro enchufado.

Tal vez haya una respuesta más general por ahí que sea independiente del proveedor, pero ten cuidado, algunos dispositivos podrían no reportar un número de serie.

0 votos

Para mí, aparecen como /dev/tty.usbmodemFD121 y /dev/tty.usbmodemFA131. El número depende directamente del puerto USB en mi computadora portátil. La información del sistema muestra la identificación correcta de los dispositivos establecida por su firmware. Ambos seriales son creados por procesadores STM32F2/F4.

1voto

Evariste Puntos 77

Utilicé la salida de ioreg y agregué un poco de análisis con perl para producir un archivo csv de puertos seriales en relación a la información usb (como VID, PID, SN).

ioreg -r -c IOUSBHostDevice -x -l | perl -ne 'BEGIN {print "Número de serie USB,idProducto,idVendedor,Dispositivo de Llamada IO\n"} /"Número de serie USB" = "(.+)"/ && ($sn=$1); /"idProducto" = (.+)/ && ($ip=$1); /"idVendedor" = (.+)/ && ($iv=$1); /"Dispositivo de Llamada IO" = "(.+)"/ && print "$sn,$ip,$iv,$1\n"'

Ejemplo de salida:

Número de serie USB,idProducto,idVendedor,Dispositivo de Llamada IO
123456,0x1234,0xaabb,/dev/cu.usbmodem1234561
987654,0xabcd,0xaabb,/dev/cu.usbmodem9876542
000001,0x4321,0xccdd,/dev/cu.usbmodem0000013

Esta salida se puede analizar fácilmente o usar en conjunto con grep para encontrar el dispositivo deseado y puerto serie

Explicación:

  • ioreg -r -c IOUSBHostDevice -x -l lista dispositivos usb host, usa -x para una salida hexadecimal
  • perl -ne para analizar la salida de ioreg, -n itera sobre la salida línea por línea, -e ejecuta el comando especificado
  • BEGIN {print "Número de serie USB,idProducto,idVendedor,Dispositivo de Llamada IO\n"} imprime la cabecera csv
  • /"Número de serie USB" = "(.+)"/ && ($sn=$1); hace coincidir un patrón y almacena el valor capturado en una variable $sn
  • /"idProducto" = (.+)/ && ($ip=$1); /"idVendedor" = (.+)/ && ($iv=$1); lo mismo que arriba
  • /"Dispositivo de Llamada IO" = "(.+)"/ && print "$sn,$ip,$iv,$1\n" cada vez que haya una línea que contenga Dispositivo de Llamada IO sabemos que estamos tratando con un puerto serie (podrías cambiar esto a IODialinDevice para tty en lugar de cu). Imprime el puerto serie e información usb almacenada más recientemente (la cual siempre viene antes en la salida de ioreg) como una línea delimitada por ,.

1 votos

Parece ser una solución plausible, pero como comenté antes, ya no tengo forma de probar esto. De todos modos, gracias por la respuesta. Puede ser de ayuda para alguien más en el futuro.

0voto

alallema Puntos 11

Tuve el mismo problema con Profilic Bridge y descargué el controlador desde http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41 solucioné el problema después de reiniciar.

1 votos

¿Qué problema fue ese? El OP preguntó cómo identificar un dispositivo, no se menciona tener problemas con el controlador.

0 votos

Esta es la respuesta correcta, he estado buscando mucho.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X