You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibUSB API使用疑问:指针声明、错误处理及批量传输排查

关于LibUSB使用的问题解答

1. 如何确定LibUSB变量的指针层级及声明使用方法

  • 直接参考API文档的函数签名:比如libusb_init的参数是libusb_context **ctx,说明需要传入指针的指针,因此声明libusb_context *context = NULL,再把&context传给libusb_init即可。
  • 对于libusb_device_handle,libusb_open_device_with_vid_pid的返回值是libusb_device_handle *,所以直接声明为libusb_device_handle *dev_handle = NULL,用函数返回值赋值,使用完成后调用libusb_close(dev_handle)释放资源。
  • 官方API文档会明确每个类型的用途:libusb_context是LibUSB的全局上下文,所有操作依赖它;libusb_device_handle是已打开设备的操作句柄。无需额外教程,通过函数参数和返回值就能明确指针层级。

2. libusb_strerror的返回值处理及字符串指针说明

  • 你写的char char *err_code是错误的,正确声明应为const char *err_code,因为函数返回的是const char *类型的常量字符串(不可修改)。
  • 字符指针能存储字符串的原因:C/C++中字符串是以\0结尾的字符数组,字符指针指向该数组的首地址,通过指针可以访问整个字符串直到遇到\0。libusb_strerror返回内部维护的常量字符串首地址,因此用const char*接收即可。
  • 正确示例:
int rc = libusb_init(&context);
const char* err_msg = libusb_strerror(rc);
std::cout << "错误信息: " << err_msg << std::endl;

3. 批量传输错误码5的排查方案

错误码5对应LIBUSB_ERROR_NOT_FOUND,结合你的代码,排查方向如下:

  1. 未占用设备接口:打开设备后需要先占用对应接口(批量端点属于某个接口),添加以下代码(接口号根据实际设备调整,通常为0):
rc = libusb_claim_interface(dev_handle, 0);
if (rc != 0) {
    std::cout << "占用接口失败: " << rc << std::endl;
    libusb_close(dev_handle);
    libusb_exit(context);
    exit(1);
}
  1. 端点地址不匹配:用设备枚举工具(如lsusb -v)查看设备实际的批量输入/输出端点地址,确认是否与你定义的IN_EP 0x81、OUT_EP 0x02一致。
  2. 未设置设备配置:部分设备需要先配置才能使用,添加配置代码(配置号根据实际设备调整,通常为1):
rc = libusb_set_configuration(dev_handle, 1);
if (rc != 0) {
    std::cout << "设置配置失败: " << rc << std::endl;
    // 错误处理逻辑
}
  1. 设备被占用:确保没有其他程序或内核驱动正在使用该设备接口,可尝试卸载对应内核驱动后重新测试。

另外,你代码最后libusb_exit后的输出是libusb_close,建议改为libusb_exit避免混淆。


内容的提问来源于stack exchange,提问作者Kishore Kumar S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:01:17