Identificando el dispositivo serial / usb python

La solución a este problema es probablemente bastante simple, pero soy nuevo para interactuar dinámicamente con un dispositivo. Lo que estoy haciendo es crear un código ejecutable de python, por lo que el usuario no tiene que tener inactivo en su computadora o cualquier tipo de intérprete de python, lo que significa que no sé en qué puerto USB se conectará el dispositivo a. El progtwig debe poder abrir una conexión a un dispositivo que esté conectado a través de un convertidor de serie a usb. ¿Cómo puedo determinar qué dispositivo conectado es el dispositivo correcto para abrir un puerto? Estoy usando pySerial para interactuar con el dispositivo. Cualquier ayuda sería muy apreciada.

No importa cómo configure su dispositivo, en algún momento probablemente tendrá que preguntar al usuario dónde está el puerto, o sondear todos los dispositivos serie para obtener una respuesta conocida. (La encuesta tiene sus trampas, sin embargo, ¡así que sigue leyendo!). A diferencia de los dispositivos USB, no hay ninguna identificación de proveedor / dispositivo que se dé a conocer al sistema operativo cuando se conecta un dispositivo serie sin formato.

Primero necesitas encontrar los puertos seriales. Aquí hay una pregunta que podría ayudar: ¿Cuál es el método multiplataforma para enumerar puertos serie en Python (incluidos los puertos virtuales)? .

Una vez que tenga una lista de puertos serie, puede preguntar al usuario si sabe cuál usar. Si lo hacen, problema resuelto!

Si no lo hacen, podría ofrecer sondear TODOS los dispositivos serie con algunos datos que sabe que proporcionarán cierta respuesta de su dispositivo. Sin embargo, tenga en cuenta que si el usuario tiene otros dispositivos serie conectados, su cadena de bytes “hola” podría ser la secuencia de autodestrucción de otro dispositivo. Por lo tanto, debe advertir al usuario de que el sondeo puede interferir con otros dispositivos y siempre avisarle antes de hacerlo.

Sin saber más acerca de su código (por ejemplo, qué marco de comunicaciones, si lo hay, está utilizando; está haciendo esto en la consola o está utilizando un kit de herramientas de GUI, etc.), es imposible decir cuál es la mejor manera de codificar esto puede ser. En el caso más simple, puede pasar por todos los dispositivos serie, enviar el saludo y verificar la respuesta. (También puede hacer esto en paralelo: bucle una vez para el saludo, y bucle nuevamente para verificar qué hay en el búfer. Si va a ser más elegante que eso, use una biblioteca adecuada).


Nota al margen: es posible que pueda evitar esto si tiene un convertidor incorporado para el cual puede establecer la identificación del proveedor / dispositivo, pero el sistema operativo moderno aún lo detectará y lo enumerará como un puerto serie; no podrás hablar con él directamente como un dispositivo USB. Podría ser posible averiguar qué puerto va con qué ID, pero nunca he intentado hacer eso. Pero este enfoque es inútil si usted no es quien elige el convertidor (por ejemplo, si es un cable suministrado por el usuario).

Esta es la forma en que utilicé para identificar un dispositivo conveter USB serie como Arduino. Comprueba la cadena ‘USB’ de la descripción del dispositivo.

import serial as ser import serial.tools.list_ports as prtlst global COMs COMs=[] def getCOMs(): global COMs pts= prtlst.comports() for pt in pts: if 'USB' in pt[1]: #check 'USB' string in device description COMs.append(pt[0]) 

La única forma en que puedo pensar para solucionar el problema con el sondeo de dispositivos desconocidos es hacer que el dispositivo envíe continuamente respuestas de “saludo” no solicitadas. Eso es lo que puedes conectar a todos los dispositivos serie y escuchar los “saludos”. Conectar y escuchar un dispositivo en serie nunca debe estropearlo.

La desventaja es que tienes estos mensajes saturando tu flujo de serie. Podría tener un comando “Estoy aquí ahora, stfu” pero luego solo puede conectarse a él una vez.

Los chips FTDI tienen un método de identificación, pero debe usar su biblioteca para acceder a los datos.