使用 usb4java 向 USB 设备发送消息 - Input/Output 错误
Sending a message to a USB device using usb4java - Input/Output Error
我正在尝试使用以下代码向我的 USB 设备(Silicon Labs USB-UART 桥)发送消息:
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.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();
}
}
}
是的,Fidor 是对的,0x01 用于写入,0x81 用于读取。
IN和OUT是从主机控制器的角度来看的。
您可以从 IN 端点读取并写入 OUT 端点。唯一的例外是控制传输,它与方向无关。
抱歉,这是我得到的描述符:
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
我正在尝试使用以下代码向我的 USB 设备(Silicon Labs USB-UART 桥)发送消息:
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.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();
}
}
}
是的,Fidor 是对的,0x01 用于写入,0x81 用于读取。 IN和OUT是从主机控制器的角度来看的。
您可以从 IN 端点读取并写入 OUT 端点。唯一的例外是控制传输,它与方向无关。
抱歉,这是我得到的描述符:
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