在Windows上列出串口(COM端口)?
我想找一种可靠的方法来列出Windows电脑上可用的串口(COM端口)。有一篇关于使用WMI的帖子,但我希望能找到一种不那么依赖.NET的方式——我想在Python或C++程序中获取端口列表,而不使用.NET。
目前我知道另外两种方法:
读取注册表中的
HARDWARE\\DEVICEMAP\\SERIALCOMM
信息。这看起来是个不错的选择,但它真的可靠吗?我在网上或MSDN上找不到任何保证,说明这个注册表项总是包含所有可用端口的完整列表。尝试调用
CreateFile
,用COMN
形式,其中N是从1开始的数字。这种方法不够好,因为并不是所有的COM端口都叫COMN。例如,一些创建的虚拟COM端口叫CSNA0、CSNB0等等,所以我不太相信这种方法。
还有其他方法、想法或经验可以分享吗?
编辑:顺便说一下,这里有一个简单的Python实现,用于从注册表读取端口名称:
import _winreg as winreg
import itertools
def enumerate_serial_ports():
""" Uses the Win32 registry to return a 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]), str(val[0]))
except EnvironmentError:
break
8 个回答
6
PySerial项目提供了一些解决方案,具体可以查看这里。
36
使用pySerial和Python:
import serial.tools.list_ports
ports = list(serial.tools.list_ports.comports())
for p in ports:
print p
8
有几种方法可以选择:
可以调用 QueryDosDevice,把设备名称设为NULL,这样可以列出所有的DOS设备。然后用CreateFile和GetCommConfig,逐个检查这些设备名称,看看哪个是串口。
可以调用 SetupDiGetClassDevs,并使用GUID_DEVINTERFACE_COMPORT这个类的GUID。