Windows平台使用hidapi接口读取HID设备数据延迟很大的解决方法
warmonkey2021/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);

}


来自:计算机科学 / 软件综合
1
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
warmonkey
学者 机友
文章
363
回复
7989
学术分
12
2008/10/11注册,32分51秒前活动

Cubesat

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}