HidSharp无法接收厂商USB HID设备输入报告求助
问题背景
使用HidSharp库读取自定义厂商USB HID设备输入报告时,程序无报错但始终无法获取数据;设备已被设备管理器识别为HID设备,Wireshark显示设备定期发送报告;库自带测试程序可正常解析其他HID设备(如耳机),说明库本身无问题。
具体调试方向
确认设备筛选逻辑准确性
检查Where(d => /* My Vendor stuff */)中的筛选条件,确保厂商ID(VendorID)、产品ID(ProductID)与设备管理器中显示的数值完全匹配(注意HidSharp中VendorID/ProductID为ushort类型,可直接用十六进制值如0x1234)。
可临时去掉筛选,打印所有HID设备信息确认目标设备是否被正确选中:foreach(var d in DeviceList.Local.GetHidDevices()) { Console.WriteLine($"VID: 0x{d.VendorID:X4}, PID: 0x{d.ProductID:X4}, Name: {d.ProductName}"); }验证报告描述符解析结果
打印设备输入报告的数量、ID和长度,确认与Wireshark中捕获的报告参数一致:foreach(var report in deviceDescriptor.InputReports) { Console.WriteLine($"Input Report ID: {report.ReportID}, Length: {report.Length}"); }注意部分厂商设备会使用带Report ID的报告,若代码直接取
First()可能选中错误的报告定义,导致缓冲区长度不匹配。跳过解析器,直接读取原始数据
暂时放弃HidDeviceInputReceiver和解析器,直接通过inputStream读取原始字节,验证底层是否能获取设备数据:byte[] buffer = new byte[64]; // 替换为Wireshark中看到的报告实际长度 while(inputStream.CanRead) { int readBytes = inputStream.Read(buffer, 0, buffer.Length); if(readBytes > 0) { Console.WriteLine($"读取到 {readBytes} 字节: {BitConverter.ToString(buffer, 0, readBytes)}"); } System.Threading.Thread.Sleep(100); }若能读到数据,说明问题出在报告解析环节;若仍读不到,需排查设备连接或权限问题。
检查报告解析器的参数传递
确认inputReportParser.TryParseReport的第三个参数是实际读取到的字节数(即TryRead返回的report变量),而非报告定义的长度。同时可打印解析前的原始缓冲区数据,与Wireshark捕获内容对比,确保数据未被篡改。排查设备独占与权限问题
- 关闭可能占用目标设备的程序(如厂商自带驱动软件),避免设备被独占导致无法读取。
- 在Windows环境下,尝试以管理员身份运行程序,排除权限不足的影响。
确认报告类型是否匹配
部分厂商设备可能将数据封装在Feature报告中而非Input报告,可尝试读取Feature报告进行验证(即使Wireshark显示为Input报告,也可作为备选排查方向)。
内容的提问来源于stack exchange,提问作者JHarnach

