HID USB ReadFile() 在大量下载期间丢失数据包

HID USB ReadFile() missing packets during large downloads

我实现了一个 HID USB PC 应用程序,它似乎可以很好地连接、读取和写入外部 USB 设备。 问题是在尝试读取大型数据文件时,一些数据包会丢失。

这是我使用的代码:

DWORD   result;
uint8_t u8_dataBuffer[size] = { 0 };
DWORD   bytesRead;
ReadFile(Handle, u8_dataBuffer,
    size + 1,
    &bytesRead,
    (LPOVERLAPPED)&m_HidOverlapped)) 


result = WaitForSingleObject(Handle, 6000);
switch (result) {
    case WAIT_OBJECT_0: {
        break;
    }
    case WAIT_TIMEOUT: {
        result = CancelIo(Handle);
        CloseHandle(Handle);
        deviceFound = false;
        break;
    }
    default: {
        break;
    }
}

HID 报告保存在环形缓冲区中。因此,如果您没有足够快地阅读所有待处理的输入报告——它们可能会丢失。 可以通过 HidD_SetNumInputBuffers call or IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS HID 设备句柄上的 IOCTL 更改此缓冲区的大小。

默认情况下,HID class 驱动程序维护一个包含 32 个报告的输入报告环形缓冲区。

有关其他信息,请参阅 Troubleshooting HID Reports#Dropped HID Reports