【发布时间】: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...),我成功地获得了制造商的字符串和十七个设备中的两个的产品,它返回一个非空值iManufacturer和iProduct。我认为其他人没有被检索到的原因与 127 字节的限制有关,但使用 getStringDescriptorAscii(handle,deviceDesriptor...,buffer) 的缓冲区大小为 1000 字节并不好。
我错过了什么?
【问题讨论】:
-
比较可能的方式?
LibUsb.open(devicedescriptor,handle).equals(LibUsb.SUCCESS) -
我不这么认为。
open函数返回一个简单的int... -
你能显示你调用
LibUsb.getDeviceList的代码部分吗?是不是您在尝试打开设备之前拨打了LibUsb.freeDeviceList(connectedDevices, true)的情况? -
我发现您的设备选择没有错误。你调用 refDevice 所以当你想打开它时它应该仍然存在。你试过不同的设备吗?所有设备都会抛出此错误吗?旁注:您在什么操作系统上工作?
-
问题已编辑以反映我最近的调查。
open函数在某些设备上成功,但随后,getDescriptor失败...