【问题标题】:Is it possible to send 0xFF in a byte array from Java to a USB device?是否可以将字节数组中的 0xFF 从 Java 发送到 USB 设备?
【发布时间】:2016-09-22 00:48:41
【问题描述】:

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

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

【问题讨论】:

    标签: java windows usb usb4java


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不确定我是否理解正确,但以下应该可以正常工作:

      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,正如预期的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        相关资源
        最近更新 更多