python:如何在串口COM上检测设备名称/ID

5 投票
3 回答
17668 浏览
提问于 2025-04-17 04:15

我想知道如何在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 个回答

1

如果你在使用USB转串口适配器,当你插入设备后,系统会在/dev/serial/by-id这个文件夹里生成一个独特的符号链接,指向设备的驱动文件。这个文件夹只有在你插入串口设备时才会出现。显示的文件名是根据设备上USB接口芯片里的产品信息生成的,每个设备的名字都是独一无二的。
举个例子,一个Korad KD3005P可编程电源会显示为usb-Nuvoton_USB_Virtual_COM_A92014090305-if00。这个符号链接最终会指向'/../../ttyACM0'。所以你需要的设备驱动文件就是'/dev/ttyACM0'。

1

两个回答

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()
5

我不太确定你使用的是什么操作系统,但这是在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

撰写回答