xlabel中文乱码 - python plot标题




列出Windows上的串行(COM)端口? (6)

我正在寻找一种强大的方法来列出Windows机器上可用的串行(COM)端口。 这篇关于使用WMI帖子 ,但是我想要一些特定于.NET的东西 - 我想在没有.NET的情况下获得Python或C ++程序中的端口列表。

我目前知道另外两种方法:

  1. 读取HARDWARE\\DEVICEMAP\\SERIALCOMM注册表项中的信息。 这看起来是一个很好的选择,但它是否健壮 ? 我无法在线或在MSDN中找到此注册表单元确实始终保留可用端口的完整列表的保证。

  2. Tryint在COMN上调用CreateFile ,其中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


在Python中使用pySerial:

import serial.tools.list_ports


ports = list(serial.tools.list_ports.comports())
for p in ports:
    print p

我认为WMI是要走的路,因为它很容易上手,而且代码很少。 它使您不必在注册表中进行挖掘,并为您提供一些保证,确保它将来可用于更一般的情况。

您可以使用pip install pypiwin32 WMI安装所需的一切,它可以开箱即用。

import wmi

query = "SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%(COM%)'"
coms  = wmi.WMI().query(query)

for com in coms:
    print(com.Name)

产量

Communications Port (COM1)
mbed Serial Port (COM3)
mbed Serial Port (COM5)

我的猜测是你的串口是某种即插即用,所以这应该工作正常。 由于某种原因, Win32_SerialPort不适用于所有端口。



现在有一个Powershell单线程。

[System.IO.Ports.SerialPort]::GetPortNames()

这肯定是相当晚的,但它对我有帮助!

http://eli.thegreenplace.net/2009/07/31/listing-all-serial-ports-on-windows-with-python/

特别是这个例子:

import re

def full_port_name(portname):
    """ Given a port-name (of the form COM7,
        COM12, CNCA0, etc.) returns a full
        name suitable for opening with the
        Serial class.
    """
    m = re.match('^COM(\d+)$', portname)
    if m and int(m.group(1)) < 10:
    return portname
return '\\\\.\\' + portname






serial-port