2011-05-30 20 views
5

Necesito lista o enumerar de los puertos serie existentes, Hasta ahora yo estaba usando este método enumerate_serial_ports (), pero no su trabajo con Windows 7. ¿Conoce alguna alternativa ¿cómo puedo averiguar serie disponible puertos bajo Windows 7?PySerial enumerar los puertos

def enumerate_serial_ports(): 
    """ Uses the Win32 registry to return an 
     iterator of serial (COM) ports 
     existing on this computer. 
    """ 
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM' 
    try: 
     key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path) 
    except WindowsError: 
     raise IterationError 

    for i in itertools.count(): 
     try: 
      val = winreg.EnumValue(key, i) 
      yield str(val[1]) 
     except EnvironmentError: 
      break 

me sale IterationError enter image description here

+0

¿Qué es exactamente lo que no funciona? –

+0

a Space_C0wb0y: se agregó la imagen – Meloun

+0

no genera una excepción de clase desconocida (IterationError), permita que la traceback nos ayude en cuál es el problema real;) –

Respuesta

3

Usted está levantando una IterationError, pero esa excepción no existe realmente. Tal vez deberías intentar aumentar EnvironmentError para esa condición también.

Los documentos pySerial incluyen algunos ejemplos de código para encontrar puertos serie. Échales un vistazo: http://pyserial.sourceforge.net/examples.html#finding-serial-ports

+0

Su problema no es con el IterationError. Reparar este nombre no resolverá el problema. – JBernardo

+0

Es cierto, pero el código de muestra pySerial podría. – mrb

+1

Esa URL no parece aplicable ahora. Tal vez http://pyserial.sourceforge.net/shortintro.html#testing-ports en su lugar. –

15

Ahora hay un módulo list_ports integrado en pyserial.

In [26]: from serial.tools import list_ports 
In [27]: list_ports.comports() 
Out[27]: 
[('/dev/ttyS3', 'ttyS3', 'n/a'), 
('/dev/ttyS2', 'ttyS2', 'n/a'), 
('/dev/ttyS1', 'ttyS1', 'n/a'), 
('/dev/ttyS0', 'ttyS0', 'n/a'), 
('/dev/ttyUSB0', 
    'Linux Foundation 1.1 root hub ', 
    'USB VID:PID=0403:6001 SNR=A1017L9P')] 

El módulo también puede ser ejecutado directamente:

$ python -m serial.tools.list_ports 
/dev/ttyS0   
/dev/ttyS1   
/dev/ttyS2   
/dev/ttyS3   
/dev/ttyUSB0   
5 ports found 
+0

Este código no funcionó para mí, dado que list_ports.comports() es un generador, tuve que hacer: de serial.tools import list_ports para a en list_ports.comports(): print (a) – RyanN

+0

@RyanN Puede convertir fácilmente un generador en una lista envolviéndolo con list() – payne

+0

list_ports no parece encontrar todos los puertos com, porque tengo un dispositivo serie USB que no aparece con el generador list_ports, pero realterm lo encuentra y lo coloca en la lista de puertos seleccionables sin ningún problema. Termina siendo COM20, y si abro COM20 con el módulo serial, funciona bien. Pero si quiero que el usuario pueda seleccionar entre los puertos existentes, tengo que hacer que aparezca en la lista de puertos disponibles. – RufusVS

1

A continuación encontrará mi función auxiliar para imprimir los nombres y descripción de los puertos de comunicación disponibles, utilizando el módulo serial:

from serial.tools import list_ports 
print(
    "\n".join(
     [ 
      port.device + ': ' + port.description 
      for port in list_ports.comports() 
     ])) 

Ejemplo de salida:

python.exe -u listSerialPorts.py 
COM4: Sierra Wireless NMEA Port (COM4) 
COM12: USB Serial Port (COM12) 
COM10: USB Serial Port (COM10) 
COM3: Intel(R) Active Management Technology - SOL (COM3) 
COM5: Sierra Wireless DM Port (COM5) 
Cuestiones relacionadas