Python通过注册表获取串口列表

工作中需要使用CameraLink协议中的串口和设备进行通信,DALSA采集卡软件中可以将该串口映射到一个COM口上,但是该COM口在Windows的设备管理器中无法识别。使用Python的serial模块或者npm的serialport模块自带枚举函数都无法获取到该COM口。

JavaScript中,使用以下代码定时轮询串口列表

1
2
3
4
5
6
7
8
9
10
11
12

import serialport from 'serialport'

setInterval(() => {
serialport.list().then(
ports => {
if (ports.length > 0) {
/* do something */
}
}
)
}, 500)

Python中,使用以下代码获取串口列表

1
2
3
4
5
import serial
import serial.tools.list_ports

plist = list(serial.tools.list_ports.comports())
ports = [p.name for p in plist]

以上方式都无法获取采集卡映射的COM口。Python中可以使用win32api和win32con通过枚举注册表中的信息来获取串口列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import win32api
import win32con

def get_serial_ports():
ports = []
key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,
"HARDWARE\DEVICEMAP\SERIALCOMN", 0, win32con.KEY_READ)
try:
i = 0
while True:
name, value, type1 = win32api.RegEnumValue(key, i)
print("name:{} value:{}".format(name, value))
i += 1
ports.append(value)
except:
print('except')
win32api.RegCloseKey(key)
return ports

使用RegOpenKey接口来读取键值,使用完毕后需要用RegCloseKey关闭。通过RegEnumValue来枚举串口列表,COM口名称在value字段