Отправка сообщения на USB-устройство с помощью usb4java - Ошибка ввода/вывода

Я пытаюсь отправить сообщение на свое USB-устройство (Silicon Labs USB-UART Bridge), используя этот код:

public void sendMessage(UsbInterface iface, String message,
        int i){

    UsbPipe pipe = null;

    try {
        iface.claim(new UsbInterfacePolicy() {
            @Override
            public boolean forceClaim(UsbInterface usbInterface) {
                return true;
            }
        });

        UsbEndpoint endpoint = (UsbEndpoint) iface.getUsbEndpoint((byte) i);
        pipe = endpoint.getUsbPipe();
        pipe.open();

        int sent = pipe.syncSubmit(message.getBytes());

        System.out.println(sent + " bytes sent");
        pipe.close();

    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        try {
            iface.release();
        } catch (UsbClaimException e) {
            e.printStackTrace();
        } catch (UsbNotActiveException e) {
            e.printStackTrace();
        } catch (UsbDisconnectedException e) {
            e.printStackTrace();
        } catch (UsbException e) {
            e.printStackTrace();
        }
    }
}//sendMessage

Когда я его выполняю:

public static void main(final String[] args) throws UsbException {

    Usb4JavaHigh usb4java = new Usb4JavaHigh();
    UsbDevice usbDevice = usb4java.findDevice((short) (0x10C4), (short) (0xEA60));

    usb4java.sendMessage(usb4java.getDeviceInterface(usbDevice, 0), "01FF05FB13", 0x81);
    usb4java.readMessage(usb4java.getDeviceInterface(usbDevice, 0), 0x01);
}

Я получаю эту ошибку:

javax.usb.UsbPlatformException: USB error 1: Transfer error on bulk endpoint: Input/Output Error
at org.usb4java.javax.ExceptionUtils.createPlatformException(ExceptionUtils.java:39)
at org.usb4java.javax.IrpQueue.transferBulk(IrpQueue.java:239)
at org.usb4java.javax.IrpQueue.transfer(IrpQueue.java:197)
at org.usb4java.javax.IrpQueue.read(IrpQueue.java:126)
at org.usb4java.javax.IrpQueue.processIrp(IrpQueue.java:76)
at org.usb4java.javax.AbstractIrpQueue.process(AbstractIrpQueue.java:104)
at org.usb4java.javax.AbstractIrpQueue$1.run(AbstractIrpQueue.java:73)
at java.lang.Thread.run(Unknown Source)

Однако я не получаю сообщения об ошибке для моего readMessage, кто-нибудь знает причину, по которой это так, или получил подсказку?

Заранее спасибо!

Редактировать: код работает, когда я меняю конечную точку на 0x01, но это EP 1 OUT, 0x81 — это EP 1 IN, так что я должен отправлять свои сообщения или нет?

Редактировать 2: Код readMessage:

public void readMessage(UsbInterface iface, 
        int j){

    UsbPipe pipe = null;

    try {
        iface.claim(new UsbInterfacePolicy() {
            @Override
            public boolean forceClaim(UsbInterface usbInterface) {
                return true;
            }
        });

        UsbEndpoint endpoint = (UsbEndpoint) iface.getUsbEndpoint((byte) j); // there can be more 1,2,3..
        pipe = endpoint.getUsbPipe();
        pipe.open();

        /*pipe.addUsbPipeListener(new UsbPipeListener()
        {            
            @Override
            public void errorEventOccurred(UsbPipeErrorEvent event)
            {
                UsbException error = event.getUsbException();
                error.printStackTrace();
            }

            @Override
            public void dataEventOccurred(UsbPipeDataEvent event)
            {
                byte[] data = event.getData();

                System.out.println(data + " bytes received");
                for(int i =0 ; i<data.length; i++){System.out.print(data[i]+" ");}
            }
        });*/

        byte[] data = new byte[8];
        int received = pipe.syncSubmit(data);
        System.out.println(received + " bytes received");
        for(int i =0 ; i<data.length; i++){System.out.print(data[i]+" ");}//*/

        pipe.close();

    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        try {
            iface.release();
        } catch (UsbClaimException e) {
            e.printStackTrace();
        } catch (UsbNotActiveException e) {
            e.printStackTrace();
        } catch (UsbDisconnectedException e) {
            e.printStackTrace();
        } catch (UsbException e) {
            e.printStackTrace();
        }
    }

}

person pilgrimm    schedule 17.08.2016    source источник
comment
Код работает, когда я изменяю конечную точку на 0x01, но это EP 1 OUT - я подозреваю путаницу в терминах. Я предполагаю, что это видно с точки зрения клиента. Это ваш выход, который является входом трубы...   -  person Fildor    schedule 17.08.2016


Ответы (2)


Да, Фидор прав, 0x01 для записи и 0x81 для чтения. IN и OUT с точки зрения хост-контроллера.

Вы можете читать из конечных точек IN и записывать в конечные точки OUT. Единственным исключением является передача управления, которая не зависит от направления.

person dryman    schedule 17.08.2016
comment
Что ж, когда я пытаюсь прочитать из 0x81, я получаю точно такое же сообщение об ошибке для моего readMessage. Хотя sendMessage работает. - person pilgrimm; 17.08.2016
comment
То же самое означает и ошибку USB 1? Вы изучали дескрипторы конечных точек этих конечных точек? - person dryman; 17.08.2016
comment
Да, та же ошибка, что описана выше, я получил свои дескрипторы Endpoint с помощью дампа устройства, это дескрипторы: - person pilgrimm; 17.08.2016
comment
Я ничего не вижу. Вы нажали Добавить комментарий? - person dryman; 17.08.2016
comment
Так что конечная точка правильная. Что-то должно быть с переносом. Можете ли вы отредактировать вопрос с исходным кодом readMessage? - person dryman; 17.08.2016
comment
Я нашел другой способ, рассматривая свой порт как COM-порт и, таким образом, избегая usb4java, но большое спасибо за вашу помощь! :) - person pilgrimm; 17.08.2016
comment
Хорошо, я думал, вы уже знаете, что это устройство эмуляции COM, и просто хотели написать свой собственный драйвер. :) Я рад слышать, что вы нашли решение. - person dryman; 18.08.2016

Извините, вот дескрипторы, которые я получил:

Endpoint Descriptor:
  bLength                  7
  bDescriptorType          5
  bEndpointAddress      0x01  EP 1 OUT
  bmAttributes             2
    Transfer Type             Bulk
    Synch Type                None
    Usage Type                Data
  wMaxPacketSize          64
  bInterval                0

Endpoint Descriptor:
  bLength                  7
  bDescriptorType          5
  bEndpointAddress      0x81  EP 1 IN
  bmAttributes             2
    Transfer Type             Bulk
    Synch Type                None
    Usage Type                Data
  wMaxPacketSize          64
  bInterval                0
person pilgrimm    schedule 17.08.2016