usb4java Ошибка USB 4: невозможно открыть USB-устройство:

Я пытаюсь взаимодействовать с контроллером PS3 DS3. Мне удалось сделать это в C#, используя реализацию libusb, но я решил переместить свою реализацию в java. К сожалению, мой переход на Java не был таким гладким. Кажется, что устройство найдено в списке устройств, но когда я пытаюсь открыть его, я получаю следующую ошибку "Ошибка USB 4: невозможно открыть USB-устройство: такого устройства нет (возможно, оно было отключено)"

public class Main {
private static final short VID = 0x054c;
private static final short PID = 0x0268;

Context context;

public Main() {
    context = new Context();
    int result = LibUsb.init(context);

    if (result != LibUsb.SUCCESS) {
        throw new LibUsbException("Unable to initialize libusb.", result);
    }

    ByteBuffer data = ByteBuffer.allocate(49);
    DeviceHandle ds3Handle = getDeviceHandle(findDevice(VID, PID));
    LibUsb.controlTransfer(ds3Handle, (byte)0xa1, (byte)0x1, (short)0x101, (short)0, data, 1000L);

    LibUsb.exit(context);
}

private Device findDevice(int vid, int pid) {
    Device UsbDevice = null;
    DeviceList list = new DeviceList();
    int result = LibUsb.getDeviceList(context, list);

    if (result < 0) {
        throw new LibUsbException("Unable to get device list", result);
    } 

    try {
        for(Device device: list) {
            DeviceDescriptor descriptor = new DeviceDescriptor();
            result = LibUsb.getDeviceDescriptor(device, descriptor);

            if (result != LibUsb.SUCCESS) {
                throw new LibUsbException("Unable to read device descriptor", result);
            } 

            if (descriptor.idVendor() == vid && descriptor.idProduct() == pid) {
                UsbDevice = device;
                System.out.println("found");
            }
        }
    } finally {
        LibUsb.freeDeviceList(list, true);
    }

    return UsbDevice;
}

private DeviceHandle getDeviceHandle(Device device) {
    DeviceHandle handle = new DeviceHandle();
    int result = LibUsb.open(device, handle);

    if (result != LibUsb.SUCCESS) {
        throw new LibUsbException("Unable to open USB device", result);
    }

    return handle;
}

public static void main(String [] args){
    new Main();
}
}

person Devin Wall    schedule 24.09.2014    source источник


Ответы (2)


LibUsb.freeDeviceList(список, правда);

Это true и есть проблема. «final boolean unrefDevices» отображается в javadoc. Ваш код освобождает устройство до того, как вы сможете его открыть.

person Not Relevant    schedule 26.02.2015
comment
Могу подтвердить, это решение проблемы ОП. Только что столкнулся с той же проблемой, используя тот же пример кода со страницы usb4java. Очень признателен! - person Matt Clark; 03.03.2015
comment
Их сайт находится на GitHub. Оформил пиар. github.com/usb4java/usb4java.github.io/pull/2 - person tresf; 29.02.2016
comment
Похоже, что ошибка действительно вызвана выпуском устройств, но как мне это исправить? Когда я меняю свою истину на ложь, это дает другую ошибку. - person Mathieu Brouwers; 13.12.2016

Просто изменить на false недостаточно, вам также нужно вызвать refDevice с устройством, которое вам нужно вернуть, пример:

    } finally {
        // Ensure the allocated device list is freed
        LibUsb.freeDeviceList(list, false);
    }

    if (deviceFound != null) {
        // Device found
        LibUsb.refDevice(deviceFound);
    }
    return deviceFound;
person Rey Lagarto    schedule 11.08.2017