首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libusb_open在windows 10上返回LIBUSB_ERROR_NOT_SUPPORTED

libusb_open在windows 10上返回LIBUSB_ERROR_NOT_SUPPORTED
EN

Stack Overflow用户
提问于 2022-04-30 11:41:42
回答 1查看 955关注 0票数 0

操作系统: Windows 10 64位

编译器: MSVC 19 std:c++20

静态连接

下面的代码只是初始化和打印有关设备的一些信息

代码语言:javascript
复制
#include "libusb.h"
#include <iostream>

int main()
{
  libusb_context* cntx{ nullptr };
  int status{ libusb_init(&cntx) };
  if (status != LIBUSB_SUCCESS)
  {
    std::cerr << libusb_strerror(status);
    return -1;
  }
  libusb_device** devices;
  ssize_t numberOfDevices{ libusb_get_device_list(cntx, &devices) };
  if (numberOfDevices <= 0)
  {
    std::cerr << "Device does NOT found\n";
    return -1;
  }
  std::cout << "Found " << numberOfDevices << " Devices\n";
  int index{ 0 };
  std::cout << std::hex;
  std::cout << "Device Address: " << +libusb_get_device_address(devices[index]) << '\n'
            << "Port Number: "    << +libusb_get_port_number(devices[index]) << '\n'
            << "Bus Number: "     << +libusb_get_bus_number(devices[index]) << '\n'
            << "Device Speed: ";
  switch (libusb_get_device_speed(devices[index])
  {
  case LIBUSB_SPEED_SUPER:      std::cout << "5Gb\n";     break;
  case LIBUSB_SPEED_SUPER_PLUS: std::cout << "10Gb\n";    break;
  case LIBUSB_SPEED_FULL:       std::cout << "12Mb\n";    break;
  case LIBUSB_SPEED_LOW:        std::cout << "1.5Mb\n";   break;
  case LIBUSB_SPEED_HIGH:       std::cout << "480Mb\n";   break;
  default:                      std::cout << "UNKNOWN\n"; break;
  }

到目前为止还不错,但是当我想打开(例如)设备时,LIBUSB_ERROR_NOT_SUPPORTED将返回:

代码语言:javascript
复制
  constexpr std::uint16_t VID{ 0x8086 };
  constexpr std::uint16_t PID{ 0x1D26 };
  libusb_device_handle* device{ nullptr };
  status = libusb_open(devices[index], &device);
  if (status)
  {
    std::cerr << "Can NOT open the device: " << libusb_strerror(status) << '\n';
    device = libusb_open_device_with_vid_pid(cntx, VID, PID);
    if (!device)
    { 
      std::cerr << "Can NOT open the device with VID & PID\n";
      return -1;
    }
  }
  std::cout << "Device opened\n";
  return 0;
}

这两样都不管用。顺便说一句,这个设备是由一个微型程序员编写的,所以我不知道他是如何编程的,我的工作就是从设备中获取数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-30 13:33:55

libusb可以枚举所有USB设备。但它只能打开安装了WinUSB驱动程序(或libusbK或libusb0)的设备。WinUSB是直接与USB设备及其端点一起工作的通用驱动程序,不需要实现和提供自己的设备驱动程序。

如果设备没有实现Windows为其提供和加载标准驱动程序的任何标准USB协议(海量存储、摄像机、音频、串口等),并且设备本身没有需要首先安装的驱动程序,则这是适当的。

在Linux和macOS上,这不是一个问题,因为没有专用驱动程序的USB设备可以在没有任何驱动程序麻烦的情况下提供给应用程序。

为了安装WinUSB,可以使用扎迪格。请确保选择正确的设备,如果出现问题,可以将其拔出电源。如果将驱动程序替换为USB主机控制器、键盘等关键设备,则PC可能不再启动。

为了使WinUSB安装自动化,该设备可以实现额外的USB控制请求。有两种选择:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72068206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档