serial read mac index python pyserial

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())



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.



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