USB多点触控上报协议详解

USB HID-compliant mouse报点协议解析


本篇文章主要是对usb 多点触控给Windows上报点位时上报的数据解析。至于usb怎样枚举出一个多点触控在这不做解释,网上有很多教程。
1、当你的usb hid设备枚举正常后,你可以使用bus hound看到你的usb 设备里有一个新增的HID-compliant mouse接口。可以通过usbTreeView查看对应的端点,我这里的该接口对应的是端点1。所以上报触摸点时,通过端点1上报就好。
.
2、windows要知道你的触摸状态,必须要知道你有几个点上报,每个点的状态(按下还是松开),每个点对应的id(也就是对应的手指id),每个点的坐标。由上面的端点描述可以看到bInterval = 0x01(1ms),也就是说windows这边时1ms找我们要一次触摸点的坐标,当我们有坐标点更新时就上传坐标点,当没有触摸时,直接NAK就好。
3、数据报文来了。举个例子

012345678910111213
0x020x070x000x000x040x000x040x060x010x000x080x000x080x02
设备 ID第一个点触摸状态手指IDX坐标低8位X坐标高8位Y坐标低8位Y坐标高8位第二点触摸状态手指IDX坐标低8位X坐标高8位Y坐标低8位Y坐标高8位此包中的有效点数
设备ID固定值被按下手指id为0x00X坐标为0x0400计算下来为1024Y坐标为0x0400计算下来为1024被释放手指id为0x01X坐标为0x800计算下来为2048Y坐标为0x0800计算下来为2048有点数为2个

上面的报文(0x02,0x07,0x00,0x00,0x04,0x00,0x04,0x06,0x01,0x00,0x08,0x00,0x08,0x02)的意思就是0号手指被按下,其坐标点为(1024,1024),1号手指被释放,释放的位置坐标点为(2048,2048)。依此类推,如果需要报第三点、第四点等按照上面的格式添加数据就可以了。

USB多点触控设备上报协议的C语言程序需要使用USB接口进行通信,可以使用libusb库来进行USB通信。 以下是一个简单的USB多点触控设备上报协议的C语言程序示例: ```c #include <stdio.h> #include <stdlib.h> #include <libusb-1.0/libusb.h> // USB设备的Vendor ID和Product ID #define VENDOR_ID 0x1234 #define PRODUCT_ID 0x5678 // USB设备的端点地址 #define ENDPOINT_IN 0x81 int main() { libusb_device_handle *dev_handle = NULL; libusb_context *ctx = NULL; int r; // 初始化libusb库 r = libusb_init(&ctx); if (r < 0) { fprintf(stderr, "libusb_init failed: %s\n", libusb_error_name(r)); return 1; } // 打开USB设备 dev_handle = libusb_open_device_with_vid_pid(ctx, VENDOR_ID, PRODUCT_ID); if (dev_handle == NULL) { fprintf(stderr, "libusb_open_device_with_vid_pid failed\n"); libusb_exit(ctx); return 1; } // 设置USB设备配置 r = libusb_set_configuration(dev_handle, 1); if (r < 0) { fprintf(stderr, "libusb_set_configuration failed: %s\n", libusb_error_name(r)); libusb_close(dev_handle); libusb_exit(ctx); return 1; } // 分配USB设备端点 r = libusb_claim_interface(dev_handle, 0); if (r < 0) { fprintf(stderr, "libusb_claim_interface failed: %s\n", libusb_error_name(r)); libusb_close(dev_handle); libusb_exit(ctx); return 1; } // 读取USB设备数据 unsigned char buf[64]; int transferred; r = libusb_interrupt_transfer(dev_handle, ENDPOINT_IN, buf, sizeof(buf), &transferred, 1000); if (r < 0) { fprintf(stderr, "libusb_interrupt_transfer failed: %s\n", libusb_error_name(r)); libusb_release_interface(dev_handle, 0); libusb_close(dev_handle); libusb_exit(ctx); return 1; } // 处理USB设备数据 printf("Received %d bytes of data: ", transferred); for (int i = 0; i < transferred; i++) { printf("%02X ", buf[i]); } printf("\n"); // 释放USB设备端点 libusb_release_interface(dev_handle, 0); // 关闭USB设备 libusb_close(dev_handle); // 退出libusb库 libusb_exit(ctx); return 0; } ``` 需要注意的是,上述示例中的Vendor ID、Product ID和端点地址都需要根据实际的USB多点触控设备进行修改。另外,USB多点触控设备上报协议的数据格式也需要根据设备的具体协议进行解析和处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值