Rob*_*Rob 10 java windows serial-port device-driver
我有一个串行到USB设备,在Windows设备管理器中具有类似命名的设备驱动程序.设备并不总是在系统启动时获取相同的COM端口,因此我的程序需要在启动时识别它.
我已经尝试使用RXTX来枚举系统上的COM端口,但这不起作用因为CommPortIdentifier.getName()只返回COM名称(例如COM1,COM2等)我需要获取驱动程序制造商名称或驱动程序显示在设备管理器中的名称,并将其与COM名称关联.
这可以用Java轻松完成吗?(我对任何支持它的第三方Java库感兴趣.)否则,我如何通过win32 API开始实现这一目标?
Rob*_*Rob 11
我WinRegistry在这个SO问题中使用David提供的类来实现我想要的,以从与我的USB设备关联的注册表项中获取FriendlyName.然后我从友好名称解析出COM号码.
有些事情需要考虑:
USB设备位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\注册表中(在WinXP,Win7上测试).
我要求设备VID + PID识别正确的设备密钥(例如).VID_xxxx&PID_xxxx由于VID和PID是特定于设备的,因此该密钥在多个系统中应该是可靠的.
该VID_xxxx&PID_xxxx密钥包含设备值的另一个子项.我在枚举子键时遇到了一些麻烦WinRegistry,所以我在开发过程中将子键名称硬编码为快速入侵.一个更安全的解决方案是搜索子键以找到正确的名称.
无论设备当前是否连接,设备密钥都存在于注册表中.此代码假设Windows将在设备重新连接到其他COM端口时更新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));
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11061 次 |
| 最近记录: |