2016-09-22 2 views
0

Я пишу код Java с usb4java для связи с измерительным прибором, подключенным через USB, с помощью управляющих передач (Windows). Данные передаются с использованием ByteBuffer, заполненного шестнадцатеричными значениями, ожидаемыми устройством.Можно ли отправить 0xFF в массив байтов с Java на USB-устройство?

Вот соответствующий фрагмент кода:

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. Но есть ли способ обойти это и получить правильное значение для устройства?

Это были очень тяжелые дни, и, как выяснилось, проблема была решена, я ударил стену с ограничением размера байта. Заранее благодарим за любые предложения!

ответ

0

Попробуйте положить -1 в массив, так как это должно быть представлено как 11111111, когда вы используете подписанный 8-битный тип. Вероятно, вы могли бы написать его как 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 после приращения, как и следовало ожидать.

Смежные вопросы