Java 获取USB设备的字符串描述符
在Windows 8.1下,使用Java 获取USB设备的字符串描述符,java,usb,libusb,usb4java,Java,Usb,Libusb,Usb4java,在Windows 8.1下,使用LibUsb.getDeviceList(null,connectedDevices),我成功地使用以下代码将每个USB设备连接到我的电脑: connectedDevices= new DeviceList(); if(LibUsb.getDeviceList(null,connectedDevices){ selectedDevices= new LinkedList<Device>(); deviceDescriptor= new
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);
我要么将LIBUSB.ERROR\u NO\u DEVICE
错误代码返回到open
函数,我发现这对于几毫秒前发现的设备来说很奇怪,要么将LIBSUSB.ERROR\u INVALID\u参数
错误代码返回到getDescriptor
。使用LibUsb.getStringDescriptor(handle,deviceDescriptor.iManufacturer(),(short)0x409,buffer)
也会失败,错误代码相同
使用LibUsb.getStringDescriptor(handle,deviceDescriptor…
),我成功地获取了制造商的字符串和17个设备中的两个设备的产品,这两个设备返回了iManufacturer
和iProduct
的非空值。我认为其他人无法检索的原因与127字节的限制有关,但使用getStringDescriptorAscii(句柄,DeviceDescriptor…,缓冲区)
,缓冲区大小为1000字节,效果并不好
我遗漏了什么?我想你的方法错了。改用
getStringDescriptor
应该可以修复它。但我不知道有一个语言id 1000。尽管如此,将一个短字符转换成字节本应是一个彻底的赠品 比较可能是一种方式LibUsb.open(devicedescriptor,handle).equals(LibUsb.SUCCESS)
我不这么认为。open
函数返回一个简单的int
…您能显示调用LibUsb.getDeviceList
的代码部分吗?在您尝试打开设备之前,是否会调用LibUsb.freeDeviceList(connectedDevices,true)
?我看不到您的设备选择中有任何错误。您可以调用refDevice,这样当您想要打开它时,它应该仍然在那里。你试过不同的设备吗?是否所有设备都会抛出此错误?旁注:你们在什么操作系统上工作?这个问题经过编辑以反映我上次的调查。对于某些设备,open
函数成功,但随后,getDescriptor
失败…使用getStringDescriptor
不会有帮助:由于open
函数返回错误,甚至不会执行getDescriptor
函数。。。对于第二点,您是对的,将1000转换为字节是没有意义的,但是当我在其他地方关注时,我没有看到它。另外,我只找到了一个C LibUSB的文档,它似乎和Java LibUSB有一些不同(尤其是在参数类型方面,C不是面向对象的)。Java LibUsb文档是否存在?哦,好吧,您在问题中从未提到异常发生在哪里,所以我假设它发生在getStringDescriptor
方法中。你可以在这里找到api文档:对不起!编辑问题以指定它。谢谢你的链接。你看到我同时对这个问题的评论了吗?哪一个评论?以“哦,好的…”开头的那个?
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);
}