如何查看使用LibUsbDotNet写入USB设备时返回的Win32错误信息?
解决LibUsbDotNet写入USB设备时的Win32错误
针对你遇到的写入Win32错误问题,可按以下步骤排查和修复:
1. 先获取详细错误信息
当前代码仅获取了错误码,未输出具体错误描述,这是定位问题的关键。修改写入逻辑,添加错误详情打印:
case "1": ErrorCode ec = ErrorCode.None; Console.WriteLine("Input command:"); userInput = Console.ReadLine(); ec = writerLI7000.Write(Encoding.Default.GetBytes(userInput), 2000, out bytesWritten); // 添加错误详情输出 if (ec != ErrorCode.None) { Console.WriteLine($"写入错误: {ec} - {UsbDevice.LastErrorString}"); } break;
UsbDevice.LastErrorString会返回Win32错误的具体描述,比如权限不足、端点不存在、设备被占用等。
2. 确认端点ID是否匹配
USB端点有明确的方向规则:
- 输入端点(设备→主机)为奇数地址,对应
ReadEndpointID - 输出端点(主机→设备)为偶数地址,对应
WriteEndpointID
你代码中读写都用了Ep01,如果设备的写入端点不是Ep01(比如是Ep02),就会触发错误。可以通过以下方式确认设备端点: - 调用
LI7000.Info打印设备端点信息 - 使用USBView工具查看设备的端点配置
3. 验证设备配置和接口
- 确认
SetConfiguration(1)是设备支持的配置号:有些设备默认配置不是1,可遍历设备配置列表检查:
foreach (UsbConfigInfo config in LI7000.Configs) { Console.WriteLine($"配置ID: {config.ConfigID}, 接口数: {config.InterfaceCount}"); }
- 确认
ClaimInterface(0)是正确的接口号:部分设备的通信接口不是0,需查看设备的接口描述文档。
4. 检查数据格式是否符合设备要求
设备通常要求特定的通信格式,比如固定长度、命令前缀/后缀、校验位等。直接将输入字符串转字节可能不符合协议规范,需参考设备的通信文档,调整发送的字节数组(比如添加换行符、校验字节等)。
5. 排查权限和设备占用问题
Win32错误常见原因:
- 程序未以管理员身份运行:访问USB设备需要系统权限,右键程序选择“以管理员身份运行”重试
- 设备被其他程序占用:使用USBView工具查看设备是否被驱动或其他应用占用,关闭占用程序后再测试
6. 完善资源释放逻辑
程序退出时需释放设备资源,避免设备被锁定:
// 在case "2"的return前添加资源释放代码 case "2": if (!ReferenceEquals(wholeLI7000, null)) { wholeLI7000.ReleaseInterface(0); } LI7000?.Close(); return;
内容的提问来源于stack exchange,提问作者Zach Hall
相关产品推荐
相关产品推荐

