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

Eli*_*sky 29 c python windows winapi serial-port

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

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

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

  2. Tryint调用CreateFileCOMN1有N多家的东西.这还不够好,因为某些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
Run Code Online (Sandbox Code Playgroud)

Mat*_*ams 33

在Python中使用pySerial:

import serial.tools.list_ports


ports = list(serial.tools.list_ports.comports())
for p in ports:
    print p
Run Code Online (Sandbox Code Playgroud)

  • 或者直接从命令行,`python -m serial.tools.list_ports` (2认同)

Ore*_*ner 7

有几种选择:

  1. 使用NULL lpDeviceName 调用QueryDosDevice以列出所有DOS设备.然后依次使用CreateFile和GetCommConfig以及每个设备名称来确定它是否是串行端口.

  2. 呼叫SetupDiGetClassDevs与GUID_DEVINTERFACE_COMPORT的ClassGuid.

  3. WMI也可用于C/C++程序.

win32新闻组和CodeProject,er,项目上有一些对话.

  • 我对[Teraterm](http://logmett.com/index.php?/products/teraterm.html)列出串口的情况印象深刻.我查看了源代码,事实证明,``ttcmn.c`中的`ListupSerialPort()`(http://en.sourceforge.jp/projects/ttssh2/svn/view/trunk/teraterm/ttpcmn/ ttcmn.c?view = markup&root = ttssh2)指的是[那个CodeProject项目](http://www.codeproject.com/Articles/2609/Enumerating-serial-ports-W2K-style). (2认同)

zda*_*dav 6

PySerial项目提供了几种解决方案.


tom*_*gic 5

我刚刚创建了以下内容,基于将C++源代码读取到EnumSerialPorts并查看函数GetDefaultCommConfig().对于每个可能的COM端口,它看起来像是使用简单ANSI C和单个API调用的最简单方法.

#include <stdio.h>
#include <windows.h>
#include <winbase.h>

BOOL COM_exists( int port)
{
    char buffer[7];
    COMMCONFIG CommConfig;
    DWORD size;

    if (! (1 <= port && port <= 255))
    {
        return FALSE;
    }

    snprintf( buffer, sizeof buffer, "COM%d", port);
    size = sizeof CommConfig;

    // COM port exists if GetDefaultCommConfig returns TRUE
    // or changes <size> to indicate COMMCONFIG buffer too small.
    return (GetDefaultCommConfig( buffer, &CommConfig, &size)
                                                    || size > sizeof CommConfig);
}

int main()
{
    int i;

    for (i = 1; i < 256; ++i)
    {
        if (COM_exists( i))
        {
            printf( "COM%d exists\n", i);
        }
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)