2011-05-30 83 views
5

我需要的列表或列举现有的串口, 直到现在我用这个方法enumerate_serial_ports(),但它与Windows 7不工作,你知道一些替代我怎样才能找到可用的串行在Windows 7下的端口?pyserial枚举端口

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 

我得到IterationError enter image description here

+0

什么是不工作? – 2011-05-30 12:50:17

+0

到Space_C0wb0y:添加图片 – Meloun 2011-05-30 12:56:44

+0

不会引发nnknown类异常(IterationError),让回溯帮助我们了解真正的问题; – 2011-05-30 13:03:14

回答

3

你养的IterationError,但这一例外实际上并不存在。也许你应该试着提高EnvironmentError这个条件。

pySerial文档包含一些用于查找串行端口的示例代码。检查他们:http://pyserial.sourceforge.net/examples.html#finding-serial-ports

+0

他的问题不在于IterationError。解决这个问题并不能解决问题。 – JBernardo 2011-05-30 13:23:47

+0

是的,但pySerial示例代码可能。 – mrb 2011-05-30 14:15:50

+1

该URL现在看起来不适用。也许是http://pyserial.sourceforge.net/shortintro.html#testing-ports。 – 2013-04-22 23:14:11

15

现在有一个list_ports模块内置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')] 

该模块还可以直接执行:

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

此代码没有为我工作,因为list_ports.comports()是一个发电机,我不得不这样做: from serial.tools import list_ports for a in list_ports.comports():print(a) – RyanN 2015-03-02 04:57:08

+0

@RyanN你可以通过用list()包装它来轻松地将一个发生器变成一个列表 – payne 2015-05-26 21:36:57

+0

list_ports似乎没有找到所有可用的com端口,因为我有一个USB串行设备,它不会使用list_ports生成器显示,但realterm会发现它并将其放入可选端口列表中,而不会出现任何问题。它最终在COM20上,如果我用串口模块打开COM20,它工作正常。但是如果我希望用户能够在现有端口中进行选择,则必须使其显示在可用端口列表中。 – RufusVS 2016-01-07 03:36:03

1

下面你可以看到我的辅助函数打印的姓名和可用的COM端口的描述,使用serial模块:

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

示例输出:

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)