usb4java USB错误4:无法打开USB设备

5
我正在尝试与PS3的DS3控制器进行接口交互。我已经使用libusb的实现在C#中成功完成了这一操作,但决定将我的实现移植到java中。不幸的是,我的java移植并不顺利。设备似乎被找到并列在设备列表中,但当我尝试打开它时,出现以下错误:" USB error 4: Unable to open USB device: No such device (it may have been disconnected)"。请注意,HTML标签已保留。
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();
}
}
2个回答

10

LibUsb.freeDeviceList(list, true);

问题出在这个true上。在javadoc中显示了"final boolean unrefDevices"。你的代码在你有机会打开设备之前就释放了它。


可以确认,这是解决 OP 问题的方法。我刚刚使用 usb4java 页面上相同的示例代码遇到了同样的问题。非常感谢! - Matt Clark
1
他们的网站在GitHub上。发了一个PR。https://github.com/usb4java/usb4java.github.io/pull/2 - tresf
看起来错误确实是由设备的释放引起的,但我该如何实际修复它呢?当我将 true 改为 false 时,它会出现另一个错误。 - Mathieu Brouwers

1

仅仅将其更改为false是不够的,您还需要使用需要返回的设备调用refDevice函数 例如:

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

    if (deviceFound != null) {
        // Device found
        LibUsb.refDevice(deviceFound);
    }
    return deviceFound;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接