0

我正在使用 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 中使用的有符号字节类型的限制。但是有没有办法绕过它并为设备获取正确的值?

这几天真的很艰难,就在问题似乎得到解决的时候,我遇到了字节大小限制。在此先感谢您的任何建议!

4

2 回答 2

0

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

如果这不起作用,您能否详细说明“传递了错误的数字”是什么意思?

于 2016-09-22T05:21:08.347 回答
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正如预期的那样,它在增量之后。

于 2016-09-22T05:25:50.487 回答