python:如何在串口COM上检测设备名称/ID
我想知道如何在Python中做到这一点:
找到一个特定名称的串口(比如 \Device\VCP0 和 \Device\VCP1,这些可以通过在注册表编辑器中查看获得)
获取插入设备的ID
我已经可以用这个pySerial代码识别可用的串口,扫描活跃的串口COM
import serial
def scan():
"""scan for available ports. return a list of tuples (num, name)"""
available = []
for i in range(256):
try:
s = serial.Serial(i)
available.append( (i, s.portstr))
s.close() # explicit close 'cause of delayed GC in java
except serial.SerialException:
pass
return available
if __name__=='__main__':
print "Found ports:"
for n,s in scan():
print "(%d) %s" % (n,s)
提前谢谢你!
3 个回答
如果你在使用USB转串口适配器,当你插入设备后,系统会在/dev/serial/by-id这个文件夹里生成一个独特的符号链接,指向设备的驱动文件。这个文件夹只有在你插入串口设备时才会出现。显示的文件名是根据设备上USB接口芯片里的产品信息生成的,每个设备的名字都是独一无二的。
举个例子,一个Korad KD3005P可编程电源会显示为usb-Nuvoton_USB_Virtual_COM_A92014090305-if00。这个符号链接最终会指向'/../../ttyACM0'。所以你需要的设备驱动文件就是'/dev/ttyACM0'。
两个回答
1) 这个问题和你使用的硬件有关。也就是说,测试代码在它编写的环境中可以正常工作,但在你的环境中可能就不行了。如果你是在Windows上,而这段代码是在Linux上写的,那这种情况就很常见。代码使用了端口0,但我不太清楚它是如何对应到COM1等的。
2) 在Windows上,COM端口以前有像COM1、COM2这样的DOS名称,也就是字符串,而不是整数(它们和TCP/IP的端口号不一样)。最近在Windows中,有一种格式是\.\COMnotanumber,这样可以使用更通用的名称,我见过这种格式在USB转串口转换器中使用。快速看了一下pyserial的SerialBase在serialutil.py中的源代码,我觉得有点奇怪,因为据我所知,self.name只有在你通过调用self.port(portname)来明确设置端口时才会被赋值。你可以尝试用serport = Serial(0)来初始化串口实例,然后再明确调用serport.port('COM1')(或者用你的端口名称替代COM1)。
刚刚修正了代码,现在运行得很好... :)
import serial
def scan():
available = []
for i in range(256):
try:
s = serial.Serial('COM'+str(i))
available.append( (s.portstr))
s.close() # explicit close 'cause of delayed GC in java
except serial.SerialException:
pass
for s in available:
print "%s" % (s)
if __name__=='__main__':
print "Found ports:"
scan()
我不太确定你使用的是什么操作系统,但这是在Win7-x64上进行的。
import win32com.client
wmi = win32com.client.GetObject("winmgmts:")
for serial in wmi.InstancesOf("Win32_SerialPort"):
print (serial.Name, serial.Description)
利用这些信息,你可以解析它们并获取COM端口号。你还可以在这里找到串口实例的其他属性:http://msdn.microsoft.com/en-us/library/aa394413(v=vs.85).aspx