Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定HID设备的系统路径_C++_Linux_Usb_Hid_Mount Point - Fatal编程技术网

C++ 确定HID设备的系统路径

C++ 确定HID设备的系统路径,c++,linux,usb,hid,mount-point,C++,Linux,Usb,Hid,Mount Point,我正在寻找一种动态查找HID(USB)设备的系统路径的方法 在我的Ubuntu机器上,它是/dev/usb/hiddevX,但我想有一些发行版可以在其他地方安装hiddevices 更具体地说:我需要在一个C程序中使用它来打开一个HID设备-这应该在每个系统上都能工作,无论设备安装在哪里 当前功能: int openDevice(int vendorId, int productId) { char devicePath[24]; unsigned int numIterati

我正在寻找一种动态查找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;
}
int-openDevice(int-vendorId,int-productId){
char设备路径[24];
无符号整数=10,i,句柄;
对于(i=0;i=0){
if(isDesiredDevice(句柄、供应商ID、产品ID))
打破
关闭(手柄);
}
}
如果(i>=numIterations){
ThroweException(Exception::TypeError(String::New(“找不到设备”));
}
返回手柄;
}
它工作得很好,但我不喜欢硬编码的/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;
};
/**
*成功返回正确的句柄(文件描述符)
*
*@param int vendorId
*@param int productId
*@return int
*/
intIO::openDevice(intVendorID、intProductID){
char设备路径[24];
常量字符*设备路径[]={
“/dev/usb/hiddev\%d”,
“/dev/usb/hid/hiddev\%d”,
“/dev/hiddev\%d”,
无效的
};
无符号整数=15,i,j,句柄;
对于(i=0;设备路径[i];i++){
对于(j=0;j=0){
if(isDesiredDevice(句柄、供应商ID、产品ID))
返回手柄;
关闭(手柄);
}
}
};
ThroweException(异常::错误(字符串::新建(“找不到设备!”));
返回0;
};

<代码> C还是C++?这些是不同的语言。请删除其中一个标签。实际上,我现在在C++程序中使用它,但我以前在C程序中使用它。如果这总是Linux,它总是<代码> /DEV/USB /HIDEVX 。所以没有点猜测。真正地这是100%确定的吗?我几乎不敢相信:-)是的,它将永远在linux上。根据,是的。但是,我找不到关于3.x内核的HID设备的文档:(我知道他们引入了一个新的
hidraw
驱动程序,该驱动程序绑定到
/dev/hidrawX
,但我不知道与该驱动程序通信的细节(也找不到该驱动程序的文档)。