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

获取与COM端口相关的设备/驱动程序信息?

翟俊茂
2023-03-14
问题内容

我在Windows设备管理器中有一个带有USB设备的串行设备,其名称类似。设备在系统启动时并不总是抓住相同的COM端口,因此我的程序需要在启动时识别它。

我曾尝试使用RXTX枚举系统上的COM端口,但这没有用,因为CommPortIdentifier.getName()仅返回COM名称(例如COM1,COM2等),我需要获取驱动程序制造商名称或驱动程序在设备管理器中显示的名称,并将其与COM名称相关联。

可以用Java轻松完成吗?(我会对支持此功能的任何第三方Java库都感兴趣。)否则,我如何才能通过win32 API来实现这一目标?


问题答案:

WinRegistry通过在此SO问题中使用David提供的类,从与我的USB设备关联的注册表项中获取 FriendlyName
,我实现了所需的功能。然后,我从友好名称中解析出COM号。

要考虑的一些事情:

  1. USB设备位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\注册表中(在WinXP,Win7上经过测试)。

  2. 我需要设备VID + PID来标识正确的设备密钥(例如..)VID_xxxx&PID_xxxx。由于VID和PID是特定于设备的,因此该密钥在多个系统之间应该是可靠的。

  3. VID_xxxx&PID_xxxx键包含另一个具有设备值的子键。我在用枚举子密钥时遇到了一些麻烦WinRegistry,因此我在开发过程中将子密钥名称硬编码为快速技巧。一种更安全的解决方案是搜索子项以找到正确的名称。

  4. 不管设备当前是否连接,设备密钥都存在于注册表中。此代码假定如果设备重新连接到其他COM端口,则Windows将更新 FriendlyName 。我还没有验证这一点,但是在使用测试期间一切看起来都不错。

String keyPath = "SYSTEM\\CurrentControlSet\\Enum\\USB\\Vid_067b&Pid_2303\\";
String device1 = "5&75451e6&0&1";
System.out.println("First COM device: " + getComNumber(keyPath + device1));

import java.util.regex.Pattern;
import java.util.regex.Matcher;

// Given a registry key, attempts to get the 'FriendlyName' value
// Returns null on failure.
//
public static String getFriendlyName(String registryKey) {
    if (registryKey == null || registryKey.isEmpty()) {
        throw new IllegalArgumentException("'registryKey' null or empty");
    }
    try {
        int hkey = WinRegistry.HKEY_LOCAL_MACHINE;
        return WinRegistry.readString(hkey, registryKey, "FriendlyName");
    } catch (Exception ex) { // catch-all: 
        // readString() throws IllegalArg, IllegalAccess, InvocationTarget
        System.err.println(ex.getMessage());
        return null;
    }
}

// Given a registry key, attempts to parse out the integer after
// substring "COM" in the 'FriendlyName' value; returns -1 on failure.
//
public static int getComNumber(String registryKey) {
    String friendlyName = getFriendlyName(registryKey);

    if (friendlyName != null && friendlyName.indexOf("COM") >= 0) {
        String substr = friendlyName.substring(friendlyName.indexOf("COM"));
        Matcher matchInt = Pattern.compile("\\d+").matcher(substr);
        if (matchInt.find()) {
            return Integer.parseInt(matchInt.group());
        }
    }
    return -1;
}


 类似资料:
  • 更新时间:2019-04-16 19:04:41 各种不同的设备在不同的操作系统使用时,可能需要单独安装对应的驱动程序。为了方便用户,Hacklab提供了支持的部分开发板串口驱动程序下载及安装信息,请根据使用的开发板和PC OS下载对应的驱动程序。 串口芯片驱动 CP210x 下载地址 使用该串口驱动的开发板包括: ST Nucleo F412ZG esp32devkitc(Board类型可选择E

  • 问题内容: 我需要获取机器上所有打开的端口以及打开它们的应用程序的列表。我需要以编程方式获取此信息。 谢谢。 问题答案: 我希望能有一个更聪明的答案。我只是这样做(用Python编程),试图重写一个名为NetHogs的程序。我的版本在这里,特别是这里是Python中用于从中解析表的模块。如果您不是精通Python的人(请学习它),那么请看一下原始的NetHogs,它使用了C / C ++的混合(阅

  • 问题内容: 谁能解释我, 什么啊 这有什么用途? 如何使用? 为什么我不能定义与之功能相同的新功能? 问题答案: 一个,表示“输入- 输出控制”是一种特定于设备的系统调用。Linux(300-400)中只有几个系统调用,不足以表示设备可能具有的所有独特功能。因此,驱动程序可以定义一个ioctl,它允许用户空间应用程序向其发送订单。但是,ioctl并不是很灵活,并且会变得有些混乱(数十个“魔术数字”

  • 问题内容: 如何使用打开,关闭,ioctl等功能为i2c设备制作字符设备?最近两周我一直在寻找有关它的信息,找不到任何有效的方法。我在Essential LinuxDevice Drivers中找到了一些信息,但是它是针对2.6内核编写的,我使用3.4.79(我正尝试在cubian distr上为cubieboard2编写此驱动程序),因此本书有许多不推荐使用的功能,我试图在那里写我的驱动程序,但

  • 操作系统其中一个目的就是向用户掩盖系统硬件设备的特殊性。例如,虚拟文件系统呈现了安装的文件系统的一个统一的试图,而和底层的物理设备无关。本章描述 Linux 核心是如何管理系统中的物理设备的。 CPU 不是系统中唯一的智能设备,每一个物理设备都由它自己的硬件控制器。键盘、鼠标和串行口由 SuperIO 芯片控制, IDE 磁盘由 IDE 控制器控制, SCSI 磁盘由 SCSI 控制器控制,等等。

  • Device Drivers 设备驱动程序 Generic Driver Options 驱动程序通用选项.[提示]Linux Kernel Driver DataBase网 站是搜索驱动程序与硬件型号对应关系的绝佳网站.如果你不知道某个驱动(例如"CONFIG_INTEL_IOATDMA")究竟对应着哪些型号的硬件, 那么可以直接根据该驱动选项的首字母(本例是"I")进入对应的索引页去查找到该驱