2016-09-22 71 views
0

我正在用usb4java編寫Java代碼,用於與使用控制傳輸(Windows)通過USB連接的測量儀器進行通信。數據使用填充了設備預期的十六進制值的ByteBuffer進行傳輸。是否可以將字節數組中的0xFF發送到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放入數組中,因爲當您使用帶符號的8位類型時,應將其表示爲11111111。您可以將其編寫爲0xFF - 256以明確您的意圖。

如果這樣不起作用,您能詳細說明「不正確的數字通過」的含義嗎?

0

不知道如果我理解你的權利,但以下應能正常工作:

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

正如你所看到的,你必須明確地投值高於0x7Fbyte但不會改變的位模式。該值將被截斷爲8位。又如:

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

由於值0xFF明確強制轉換爲byte,成爲增量後0x00,符合市場預期。

相關問題