【问题标题】:Getting a string descriptor for a USB device获取 USB 设备的字符串描述符
【发布时间】:2016-08-28 07:39:10
【问题描述】:

在 Windows 8.1 下,使用LibUsb.getDeviceList(null,connectedDevices),我使用以下代码成功地将每个 USB 设备连接到我的电脑:

connectedDevices= new DeviceList();
if(LibUsb.getDeviceList(null,connectedDevices){
    selectedDevices= new LinkedList<Device>();
    deviceDescriptor= new DeviceDescriptor();
    pos=connectedDevices.iterator();
    while(pos.hasNext()){
        device=pos.next();
        if(LibUsb.getDeviceDescriptor(device,deviceDescriptor)==LibUsb.SUCCESS){
            selectedDevices.add(device);
            LibUsb.refDevice(device);
        }
    }
}
LibUsb.freeDeviceList(connectedDevices,false);

但是当我想检索“iManufacturer”不为空的特定设备的字符串描述符时:

StringBuffer buffer=new StringBuffer(1000);
device=selectedDevices.getFirst();
LibUsb.getDeviceDescriptor(device, deviceDescriptor);
handle=new DeviceHandle();
if (LibUsb.open(device,handle)==LibUsb.SUCCESS) {   
    LibUsb.getStringDescriptorAscii(handle,deviceDescriptor.iManufacturer(),buffer);            
    manufacturerDescription=buffer.toString();                  
    LibUsb.close(handle);
}

我要么得到 LIBUSB.ERROR_NO_DEVICE 错误代码以返回 open 函数,我觉得这对于仅在几毫秒前发现的设备很奇怪,要么得到 LIBSUSB.ERROR_INVALID_PARAM 错误代码以返回 getDescriptor。并使用 LibUsb.getStringDescriptor(handle,deviceDescriptor.iManufacturer(),(short)0x409,buffer)fails 以及相同的错误代码...

使用LibUsb.getStringDescriptor(handle,deviceDescriptor...),我成功地获得了制造商的字符串和十七个设备中的两个的产品,它返回一个非空值iManufactureriProduct。我认为其他人没有被检索到的原因与 127 字节的限制有关,但使用 getStringDescriptorAscii(handle,deviceDesriptor...,buffer) 的缓冲区大小为 1000 字节并不好。

我错过了什么?

【问题讨论】:

  • 比较可能的方式? LibUsb.open(devicedescriptor,handle).equals(LibUsb.SUCCESS)
  • 我不这么认为。 open 函数返回一个简单的int...
  • 你能显示你调用LibUsb.getDeviceList的代码部分吗?是不是您在尝试打开设备之前拨打了LibUsb.freeDeviceList(connectedDevices, true) 的情况?
  • 我发现您的设备选择没有错误。你调用 refDevice 所以当你想打开它时它应该仍然存在。你试过不同的设备吗?所有设备都会抛出此错误吗?旁注:您在什么操作系统上工作?
  • 问题已编辑以反映我最近的调查。 open 函数在某些设备上成功,但随后,getDescriptor 失败...

标签: java usb libusb usb4java


【解决方案1】:

我认为你的方法有误。改用getStringDescriptor 应该可以修复它。但我不知道语言 id 为 1000。尽管如此,将短片转换为字节应该是一个死的赠品。 ;)

【讨论】:

  • 使用getStringDescriptor无济于事:由于open函数返回错误,getDescriptor函数甚至没有被执行......对于第二点,你是对的,转换1000到byte 是没有意义的,但是当我专注于其他地方时,我没有看到它。另外,我只找到了 C LibUSB 的文档,并且似乎与 Java LibUSB 有一些差异(尤其是参数类型 - C 不是面向对象的)。 Java LibUsb 文档是否存在于某处?
  • 哦,好吧,您从未在问题中提到异常发生的位置,所以我认为它发生在 getStringDescriptor 方法中。你可以在这里找到一个 api 文档:usb4java.org/apidocs/org/usb4java/LibUsb.html
  • 对不起!问题已编辑以指定它。并感谢您的链接。
  • 你看到我对这个问题的评论了吗?
  • 哪条评论?以“哦,好吧……”开头的那个?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 2018-10-12
  • 2011-10-02
  • 1970-01-01
相关资源
最近更新 更多