read - Listado de puertos com disponibles con Python
serial communication python 3 (5)
Estoy buscando un método simple para enumerar todos los puertos disponibles en una PC.
Encontré este método, pero es específico de Windows: enumerar puertos serie (COM) en Windows?
Estoy usando Python 3 con pySerial en una PC con Windows 7.
Encontré en la API pySerial ( http://pyserial.sourceforge.net/pyserial_api.html ) una función serial.tools.list_ports.comports()
que enumera los puertos com (exactamente lo que quiero).
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))
Pero parece que no funciona. Cuando mi puerta de enlace USB a COM está conectada a la PC (veo el COM5 en el Administrador de dispositivos), este puerto COM no está incluido en la lista devuelta por list_ports.comports()
. En su lugar, solo obtengo COM4 que parece estar conectado a un módem (¡no lo veo en la sección COM & LPT del Administrador de dispositivos)!
¿Sabes por qué no funciona? ¿Tienes otra solución que no sea específica del sistema?
Este es el código que uso.
Probado con éxito en Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x / 10.10.x / 10.11.x y Ubuntu 14.04 / 14.10 / 15.04 / 15.10 con Python 2 y Python 3.
import sys
import glob
import serial
def serial_ports():
""" Lists serial port names
:raises EnvironmentError:
On unsupported or unknown platforms
:returns:
A list of the serial ports available on the system
"""
if sys.platform.startswith(''win''):
ports = [''COM%s'' % (i + 1) for i in range(256)]
elif sys.platform.startswith(''linux'') or sys.platform.startswith(''cygwin''):
# this excludes your current terminal "/dev/tty"
ports = glob.glob(''/dev/tty[A-Za-z]*'')
elif sys.platform.startswith(''darwin''):
ports = glob.glob(''/dev/tty.*'')
else:
raise EnvironmentError(''Unsupported platform'')
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result
if __name__ == ''__main__'':
print(serial_ports())
Puedes usar:
python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"
Filtrar por puerto conocido: python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != ''n/a'']"
Ver más información aquí: https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports
Un posible refinamiento de la excelente respuesta de Thomas es que Linux y posiblemente OSX también intenten abrir puertos y devolver solo aquellos que podrían abrirse. Esto se debe a que Linux, al menos, enumera una carga de puertos como archivos en / dev / que no están conectados a nada. Si se está ejecutando en un terminal, / dev / tty es el terminal en el que está trabajando, y abriendo y cerrando puede irse por la línea de comando, por lo que el globo está diseñado para no hacer eso. Código:
# ... Windows code unchanged ...
elif sys.platform.startswith (''linux''):
temp_list = glob.glob (''/dev/tty[A-Za-z]*'')
result = []
for a_port in temp_list:
try:
s = serial.Serial(a_port)
s.close()
result.append(a_port)
except serial.SerialException:
pass
return result
Esta modificación del código de Thomas ha sido probada solo en Ubuntu 14.04.
Varias opciones están disponibles:
Llame a QueryDosDevice con NULL lpDeviceName para listar todos los dispositivos de DOS. Luego utilice GetCommConfig y GetCommConfig con cada nombre de dispositivo para determinar si se trata de un puerto serie.
Llame a SetupDiGetClassDevs con un ClassGuid de GUID_DEVINTERFACE_COMPORT.
WMI también está disponible para los programas C / C ++ .
Hay alguna conversación sobre el grupo de noticias win32 y un proyecto CodeProject, er.
refinamiento en la respuesta de :
import serial.tools.list_ports
comlist = serial.tools.list_ports.comports()
connected = []
for element in comlist:
connected.append(element.device)
print("Connected COM ports: " + str(connected))
Esto enumera los puertos que existen en el hardware, incluidos los que están en uso. Existe mucha más información en la lista, según la documentación de las herramientas pyserial