libusb_

博客指出使用Inf - Wizard时,必须以管理员方式打开,涉及信息技术中软件使用的注意事项。

在这里插入图片描述

1. 使用Inf-Wizard时一定要用管理员方式打开

在这里插入图片描述

你提到的错误信息: ``` libusb_claim_interface failed: LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED ``` 这实际上 **并不是一个真正的错误**,而是 **你对 `libusb_claim_interface()` 的返回值处理方式有误**,或者你误解了 `libusb` 的返回值常量名称。 --- ## 🧠 问题分析 ### ✅ `libusb_claim_interface()` 的返回值 根据 `libusb` 的文档: - `libusb_claim_interface()` 返回值为 **int 类型**。 - 成功时返回:`0` - 失败时返回负值错误码(如:`LIBUSB_ERROR_BUSY`, `LIBUSB_ERROR_NO_DEVICE`, 等) ### ❌ 误解的打印方式 你看到的输出: ``` libusb_claim_interface failed: LIBUSB_SUCCESS ``` 或者 ``` libusb_claim_interface failed: LIBUSB_TRANSFER_COMPLETED ``` 这说明你可能在代码中这样打印错误信息: ```c int r = libusb_claim_interface(dev_handle, interface_number); printf("libusb_claim_interface failed: %s\n", libusb_error_name(r)); ``` 但你传入了一个 **非错误码**(比如 `0` 或 `1`),而你误以为这是一个错误。 --- ## 🔍 常见误解 | 返回值 | 含义 | |--------|------| | `0` (`LIBUSB_SUCCESS`) | 成功 | | `1` (`LIBUSB_TRANSFER_COMPLETED`) | 传输完成(不是错误) | | `< 0` | 错误码(如 `LIBUSB_ERROR_BUSY`) | ⚠️ **重点**: `libusb_error_name()` 只接受 **负值错误码**,传入正数或 `0` 会导致未定义行为或错误解释。 --- ## ✅ 正确的使用方式 ### ✅ 检查错误时只打印负值 ```c int r = libusb_claim_interface(dev_handle, interface_number); if (r < 0) { fprintf(stderr, "libusb_claim_interface failed: %s\n", libusb_error_name(r)); } ``` ### ✅ 示例代码片段 ```c #include <libusb-1.0/libusb.h> #include <stdio.h> int main() { libusb_context *ctx = NULL; libusb_device_handle *dev_handle = NULL; libusb_init(&ctx); // 假设你已经找到了设备并打开了 dev_handle int interface_number = 0; int r = libusb_claim_interface(dev_handle, interface_number); if (r < 0) { fprintf(stderr, "libusb_claim_interface failed: %s\n", libusb_error_name(r)); return 1; } printf("Interface %d claimed successfully.\n", interface_number); // 后续操作... libusb_release_interface(dev_handle, interface_number); libusb_close(dev_handle); libusb_exit(ctx); return 0; } ``` --- ## 🛠️ 常见错误原因及解决方法 | 错误码 | 含义 | 解决方法 | |--------|------|----------| | `LIBUSB_ERROR_BUSY` | 接口已被其他程序占用 | 关闭占用程序,或 detach 内核驱动 | | `LIBUSB_ERROR_NO_DEVICE` | 设备已断开连接 | 重新连接设备 | | `LIBUSB_ERROR_ACCESS` | 权限不足 | 使用 `sudo` 或配置 udev 规则 | | `LIBUSB_ERROR_NOT_FOUND` | 接口编号错误 | 检查接口编号是否正确 | | `LIBUSB_SUCCESS` (`0`) | 成功,不是错误 | 不需要处理为错误 | --- ## 🧪 如何判断接口是否被占用? 你可以使用以下命令查看设备接口是否被内核驱动接管: ```bash lsusb -v -d <vendor_id>:<product_id> ``` 如果看到类似: ``` Interface Descriptor: bInterfaceClass 3 Human Interface Device ... Interface status: 0x0001 ``` 说明接口已被占用。 ### 解决方法:Detach 内核驱动 ```c libusb_detach_kernel_driver(dev_handle, interface_number); ``` --- ## ✅ 最佳实践 ```c // Detach 内核驱动(如果需要) if (libusb_kernel_driver_active(dev_handle, interface_number) == 1) { printf("Kernel driver active, detaching...\n"); libusb_detach_kernel_driver(dev_handle, interface_number); } // Claim 接口 int r = libusb_claim_interface(dev_handle, interface_number); if (r < 0) { fprintf(stderr, "libusb_claim_interface failed: %s\n", libusb_error_name(r)); return 1; } ``` --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值