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。
我实现了一个 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。