文号
891868
阅读
26450
回复
1
收藏
2
Windows平台使用hidapi接口读取HID设备数据延迟很大的解决方法
2021/03/08
IP:广东

故障现象:


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);

}


5年8个月前IP:香港
891877
1楼

用hid传数据?直接用zadig替换掉原来的驱动,可以用python的pyusb写端点,开发起来更快一些

引用
评论(1)
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的