2016-08-28 3 views
3

В Windows 8.1, с LibUsb.getDeviceList(null,connectedDevices), я успешно получить каждый USB устройство подключено к компьютеру с помощью следующего кода:Получение строки дескриптор для устройства 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) терпит неудачу, а с тем же кодом ошибки ...

С LibUsb.getStringDescriptor(handle,deviceDescriptor...), мне удается получать строку для производителя и продукт для двух из семнадцати устройств, который возвращает ненулевое значение для iManufacturer и iProduct , Я думал, что причина, по которой другие не были получены, была связана с ограничением в 127 байтов, но с использованием getStringDescriptorAscii(handle,deviceDesriptor...,buffer) с буфером размером 1000 байт не лучше.

Что мне не хватает?

+0

Сравнение может быть путем? 'LibUsb.open (devicedescriptor, handle) .equals (LibUsb.SUCCESS)' –

+0

Я так не думаю. Функция 'open' возвращает простой' int' ... – Zelig63

+0

Можете ли вы показать часть кода, которую вы называете 'LibUsb.getDeviceList'? Возможно, это дело, которое вы называете «LibUsb.freeDeviceList (connectedDevices, true)» перед попыткой открыть устройство? – dryman

ответ

0

Я думаю, что вы получили неправильные методы. Вместо этого следует использовать getStringDescriptor. Но я не знаю языка 1000. Тем не менее, кастинг на байт короткого должен был быть мертвой поддавки. ;)

+0

Использование 'getStringDescriptor' не помогает: поскольку функция' open' возвращает ошибку, функция 'getDescriptor' даже не выполняется ... Для второго пункта вы правильно, что преобразование 1000 в 'byte' не имеет смысла, но поскольку я был сосредоточен в другом месте, я не видел этого. Additionnaly, я только нашел документацию для C LibUSB, и, похоже, есть некоторые отличия от Java LibUSB (особенно, а не неожиданно, с типами аргументов - C не является объектно-ориентированным). Существует ли где-то документация Java LibUsb? – Zelig63

+0

О, хорошо, что вы не упомянули в своем вопросе, где произошло исключение, поэтому я предположил, что это происходит в методе 'getStringDescriptor'. Вы можете найти api doc здесь: http://usb4java.org/apidocs/org/usb4java/LibUsb.html – dryman

+0

Извините! Вопрос отредактирован, чтобы указать его. И спасибо за ссылку. – Zelig63

Смежные вопросы