使用winusb

时间:2017-11-14 14:40:19

标签: qt usb winusb

我尝试使用USB设备的批量输出端点发送一些数据。 我可以使用createfile和SetupDiGetDeviceInterfaceDetail打开usb设备(corsair k65rgb键盘)接口2(它控制照明)。 但是示例代码我使用HidD_SetFeature写入数据。并从usb嗅探器中写入urb函数classe接口(使用控制端点) 但是当我打开海盗船cue软件时,它会使用urb函数批量或中断传输。

所以我知道可以发送批量数据。但我失去了如何做到这一点 谢谢

我使用QT 5.9和VS2015

1 个答案:

答案 0 :(得分:0)

您可以尝试使用winusb调用 WinUsb_WritePipe()使用批量传输来传输数据。

使用WinUsb调用之前需要接口句柄,可以通过setupApi调用获得接口句柄,并且找到所需的设备之后。 使用 CreateFile()调用打开文件句柄,然后执行 WinUsb_Initialise()获取接口句柄。 我们可以使用此接口句柄来进行进一步的WinUsb调用。对于批量传输,我们还需要管道(端点)信息,该信息可以通过以下方式获得 WinUsb_QueryPipe()调用。

检查以下参考资料以获得winusb调用列表:
https://docs.microsoft.com/en-us/windows/desktop/api/winusb/
这是使用winusb调用进行批量传输的示例代码。

    BOOL WriteToBulkEndpoint(WINUSB_INTERFACE_HANDLE hDeviceHandle, UCHAR* pID, ULONG* pcbWritten)
{
    if (hDeviceHandle==INVALID_HANDLE_VALUE || !pID || !pcbWritten)
    {
        return FALSE;
    }

    BOOL bResult = TRUE;

    UCHAR szBuffer[] = "Hello World";
    ULONG cbSize = strlen(szBuffer);
    ULONG cbSent = 0;

    bResult = WinUsb_WritePipe(hDeviceHandle, *pID, szBuffer, cbSize, &cbSent, 0);
    if(!bResult)
    {
        goto done;
    }

    printf("Wrote to pipe %d: %s \nActual data transferred: %d.\n", *pID, szBuffer, cbSent);
    *pcbWritten = cbSent;


done:
    return bResult;

}

查看以下参考资料以了解更多详细信息: 参考: