当前位置: 首页 > 面试题库 >

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

郑晨
2023-03-14
问题内容

我正在寻找一种可靠的方法来列出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

问题答案:

有几个选项:

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

  2. 呼叫SetupDiGetClassDevs与GUID_DEVINTERFACE_COMPORT的ClassGuid。

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

在win32新闻组和CodeProject
er项目上有一些对话。



 类似资料:
  • 问题内容: 我知道关于在Windows上运行Docker有很多问题,但是这个问题是关于在Windows上运行全新的Windows Docker。 就我而言,我使用的是Windows 10 Pro 64位。根据站点,此版本应受支持。 我一直在遵循在这里找到的教程:https : //prakhar.me/docker-curriculum/ 我也尝试按照官方指南进行操作:https : //docs

  • 使用8080/8005等命令删除在任何端口、Windows上运行的tomcat服务

  • 我从Arduino Uno发送到串行端口的数据可以在Arduino串行监视器中完全按照预期查看,但在我的WAMP环境中通过serproxy从PHP读取数据时,我会得到一些缺失或额外的字符(例如,通常是一个看起来像黑钻石内部的问号的字符)。 我在网上发现了类似的问题,但所有的答案都不够。解决方案通常只针对Linux,或者只是解决了让Windows从串行端口读取(而不是写入)所需的许多挑战的一部分。

  • 我已经在Windows7机器上安装了msysGit 1.7.10。我需要知道的是我是否还可以从命令行使用Git? 当我现在在命令行中尝试命令时,我看到: “git”不能识别为内部或外部命令、可操作程序或批处理文件。 有什么方法可以启用Git命令行吗?

  • 问题内容: 与嵌入式设备通信的唯一方法是串行端口。默认情况下,嵌入式Linux使用此端口作为终端。如何禁用此终端并使用串行链接传输二进制数据?我听说过类似rx和tx的命令,但我找不到它们。 我想我可以从/ dev / tty中读取和写入内容,但我想确保没有错误消息或数据流混乱。 问题答案: 您可以使用xmodem之类的应用程序通过任何终端传输文件。是您在终端上说的串行端口,还是内核控制台。 如果您

  • 我在一台linux机器上用C语言编写了一个对串行端口进行读写的程序。它连接到一个运行模拟器的Windows XP机器,该模拟器正在发送我的程序数据。 有人知道为什么会这样吗?我尝试过在fd上执行读写操作时使用互斥,但这似乎没有什么不同。如果另一个线程正在从端口运行/读取,这似乎也无关紧要。欢迎任何意见或建议,谢谢