首页 文章

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

提问于
浏览
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中使用的有符号字节类型的限制 . 但有没有办法解决它并获得设备的正确 Value ?

几天这些都非常艰难,正当问题似乎得到解决时,我打破了字节大小限制 . 在此先感谢您的任何建议!

2 回答

  • 0

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

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

  • 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 ,如预期的那样 .

相关问题