Java 获取USB设备的字符串描述符

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

在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);
我要么将
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);
}