Python pyserial枚举端口

Python pyserial枚举端口,python,pyserial,Python,Pyserial,我需要现有串行端口的列表或枚举, 到目前为止,我一直在使用这个方法枚举串行端口(),但它不适用于windows 7。你知道在windows 7下如何找到可用的串行端口吗 def enumerate_serial_ports(): """ Uses the Win32 registry to return an iterator of serial (COM) ports existing on this computer. """ path = 'HARD

我需要现有串行端口的列表或枚举, 到目前为止,我一直在使用这个方法枚举串行端口(),但它不适用于windows 7。你知道在windows 7下如何找到可用的串行端口吗

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
我得到了迭代错误

您正在引发一个
迭代错误,但该异常实际上并不存在。也许您也应该尝试为该条件引发
EnvironmentError

pySerial文档包含一些查找串行端口的示例代码。查看它们:

现在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

下面是my helper函数,可使用
串行
模块打印可用com端口的名称和说明:

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)

到Space_C0wb0y:picture已添加。若不引发nnknown类异常(IterationError),请让回溯帮助我们了解真正的问题是什么;)IterationError没有定义,但它不是您真正的问题。首先,删除
try…except
语句,并显示
key=winreg.OpenKey(winreg.HKEY\u LOCAL\u MACHINE,path)
中的错误。他的问题不在于迭代器错误。修复此名称不会解决问题。该URL现在似乎不适用。也许相反。这段代码对我不起作用,因为list_ports.comports()是一个生成器,我必须做:从serial.tools导入list_ports for a in list_ports.comports():print(a)@RyanN用list()list_ports将生成器包装成一个列表似乎找不到所有可用的com端口,因为我有一个USB串行设备,它没有使用list_ports generator显示,但realterm找到它并将其放入可选端口列表中,没有任何问题。它最终位于COM20,如果我用串行模块打开COM20,它工作正常。但是,如果我希望用户能够在现有端口中进行选择,我必须使其显示在可用端口列表中。