我正在寻找一种动态查找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
编辑:事实证明有些other programmers使用了回退到/ 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;
};