WINUSB_ControlTransfer只能在设备上可用的两个接口之一上使用,而不能在另一个上使用

时间:2018-08-24 15:02:44

标签: c++ interface usb winusb

我正在使用该设备,它有两个接口。 USB设备上的lsusb信息可在下面的链接中找到。 https://github.com/zougloub/libseek

摄像机有两个界面,第一个是iAP界面,第二个是com.thermal.pit206界面。我基于iAP界面编写了应用程序,因为。我使用iAP界面的原因是因为其他所有人都在GitHub上这样做,所以我也照做。

我可以在iAP界面上使用Winusb_ControlTrasnfer函数。我可以初始化WinUSB句柄,并使用它来发送和获取命令以及读取管道。

但是,当我使用com.thermal.pit206接口时,我仍然可以初始化WinUSB句柄,但无法发送或获取命令。

void CommandTransfer(WINUSB_INTERFACE_HANDLE winIHandle, UCHAR requestTypeI, UCHAR requestI, USHORT valueI, USHORT indexI, USHORT lengthI, PUCHAR dataIn)
{
    WINUSB_SETUP_PACKET packet;
    ZeroMemory(&packet, sizeof(WINUSB_SETUP_PACKET));
    packet.RequestType = requestTypeI;
    packet.Request = requestI;
    packet.Value = valueI;
    packet.Index = indexI;
    packet.Length = lengthI;

    ULONG dataLength = 0;

    if (!WinUsb_ControlTransfer(winIHandle, packet, dataIn, lengthI, &dataLength, NULL))
    {
        printf("ERROR: WinUsb_ControlTransfer, Windows Error Code - %d \n", GetLastError());
    }
} 

在上面您可以看到我用来将命令发送到设备的代码的副本。

我很困惑为什么在使用iAP接口时可以向设备发送命令,但是在使用com.thermal.pir206接口时却无法发送命令。

谢谢!任何有用的链接/信息都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

WinUsb_ControlTransfer()函数仅适用于默认端点0,该端点始终为control类型。

上述lsusb输出上的所有其他接口中的端点均为bulk类型。这些将需要使用WinUsb_ReadPipe()WinUsb_WritePipe()函数。