是否可以将Java中的字节数组中的0xFF发送到USB设备?

时间:2016-09-22 00:48:41

标签: java windows usb usb4java

我正在用usb4java编写Java代码,用于与使用控制传输(Windows)通过USB连接的测量仪器进行通信。使用填充了设备预期的十六进制值的ByteBuffer传输数据。

以下是代码的相关片段:

byte[] query = new byte[]{ 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
ByteBuffer buffer = ByteBuffer.allocateDirect(8);
buffer.put(query);
buffer.rewind();
int transferred = LibUsb.controlTransfer(handle, (byte)0x21, (byte)0x1, (short)0, (short)0, buffer, 1000);

代码工作正常,但只要缓冲区中的任何值超过0x7F(127),就会传递错误的数字,并且设备无法正常响应。

我显然达到了Java中使用的有符号字节类型的限制。但有没有办法解决它并获得设备的正确价值?

这几天真的很艰难,正当问题似乎得到解决时,我打破了字节大小限制。 提前感谢任何建议!

2 个答案:

答案 0 :(得分:0)

尝试将-1放在数组中,因为当您使用带符号的8位类型时,应将其表示为11111111。您可以将其写为0xFF - 256以明确您的意图。

如果这不起作用,你能详细说明你的意思是“通过了错误的号码”吗?

答案 1 :(得分:0)

不确定我是否理解你,但以下情况应该正常:

byte[] query = new byte[]{ (byte)0xFF, (byte)0xFE, 0x7F, 0x50, 0x0, 0x0, 0x0, 0x0 };
ByteBuffer buffer = ByteBuffer.wrap(query);

如您所见,您必须明确地将0x7F以上的值投射到byte,但这不会改变位模式。该值将被截断为8位。另一个例子:

byte b = (byte) 0xFF; // 0b11111111
b++; // 0b0 after increment

由于值0xFF已明确转换为byte,因此在增量之后会变为0x00,如预期的那样。