我正在寻找一种方法来动态查找 HID (USB) 设备的系统路径。
在我的 Ubuntu 机器上,它是 /dev/usb/hiddevX,但我想有些发行版会将 hiddevices 安装在其他地方。
更具体地说:我需要在 C 程序中打开 HID 设备 - 这应该适用于每个系统,无论设备安装在哪里。
当前功能:
int openDevice(int vendorId, int productId) {
char devicePath[24];
unsigned int numIterations = 10, i, handle;
for (i = 0; i < numIterations; i++) {
sprintf(devicePath, "/dev/usb/hiddev%d", i);
if((handle = open(devicePath, O_RDONLY)) >= 0) {
if(isDesiredDevice(handle, vendorId, productId))
break;
close(handle);
}
}
if (i >= numIterations) {
ThrowException(Exception::TypeError(String::New("Could not find device")));
}
return handle;
}
它运作良好,但我不喜欢硬编码的/dev/usb/hiddev
编辑:事实证明,其他一些程序员使用 /dev/usb/hid/hiddevX 和 /dev/hiddevX 的后备,所以我也内置了这些后备。
更新方法:
/**
* Returns the correct handle (file descriptor) on success
*
* @param int vendorId
* @param int productId
* @return int
*/
int IO::openDevice(int vendorId, int productId) {
char devicePath[24];
const char *devicePaths[] = {
"/dev/usb/hiddev\%d",
"/dev/usb/hid/hiddev\%d",
"/dev/hiddev\%d",
NULL
};
unsigned int numIterations = 15, i, j, handle;
for (i = 0; devicePaths[i]; i++) {
for (j = 0; j < numIterations; j++) {
sprintf(devicePath, devicePaths[i], j);
if((handle = open(devicePath, O_RDONLY)) >= 0) {
if(isDesiredDevice(handle, vendorId, productId))
return handle;
close(handle);
}
}
};
ThrowException(Exception::Error(String::New("Couldn't find device!")));
return 0;
};