故障现象:
int ret = hid_read(usb, (unsigned char*)buf.data(), buf.size());
使用hidapi库(内部是使用ReadFile)读取HID设备上传的数据,得到的数据大约是设备在200ms之前发送的。
故障原因:
windows系统会自动轮询USB HID设备,将设备发送的report放在内核的缓冲区里面。使用hid_read读取到的是缓冲区最早填入的数据。单独开线程读取、提高读取线程的优先级,不一定能解决问题。
解决方案:
缩小HID缓冲区大小是验证过的最有效的解决方法。实现方法是调用系统hid.dll的HidD_SetNumInputBuffers()函数。具体代码如下:
typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers);
static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers;
static HMODULE lib_handle = NULL;
//init low latency apis
int hid_lowlatency_init() {
lib_handle = LoadLibraryA("hid.dll");
if (lib_handle) {
#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1;
RESOLVE(HidD_SetNumInputBuffers);
#undef RESOLVE
} else return -1;
return 0;
}
//set buffer size to reduce latency, 2 is minimal lag, 32 is high lag (sys. default)
int hid_lowlatency_setbufsz(hid_device* dev, int sz) {
return (int)HidD_SetNumInputBuffers(*((HANDLE*)dev), sz);
}
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |