[英]Java writing bytes to serial port USB
我下面有一個代碼,我正在發送到串行USB端口...它正在工作,但現在不行! 如果發送了錯誤的字符串, akber()
函數就會死掉...
如果我發送akber("1.0.0.0.1.5")
-效果很好,
如果我發送akber("23.0.128.0.0.5")
-它不起作用...
見下面的代碼
public static byte[] akber(final String input) {
StringTokenizer tokens = new StringTokenizer(input, ".");
int numberOfArrays = tokens.countTokens();
byte[][] byteArrays;
byteArrays = new byte[numberOfArrays][4];
int i = 0;
int space = 0;
while (tokens.hasMoreTokens()) {
int x = Integer.valueOf(tokens.nextToken());
if (x<256) { space++; } else { space+=2; }
byteArrays[i] = BigInteger.valueOf(x).toByteArray();
i++;
}
final byte[] output = new byte[space];
copySmallArraysToBigArray(byteArrays, output);
return output;
}
public static void copySmallArraysToBigArray(final byte[][] smallArrays, final byte[] bigArray) {
int currentOffset = 0;
for (final byte[] currentArray : smallArrays) {
System.arraycopy(currentArray, 0, bigArray, currentOffset, currentArray.length);
currentOffset += currentArray.length;
}
}
從函數調用:
serialPort.writeBytes(akber(data));
我需要它與“數據”字符串中的任何數字組合一起工作,因此它將其轉換為正確的字節類型並寫入端口...這不是我的代碼,我不太理解,但是仍然需要修復它:-)
更改此行:
if (x<256) { space++; } else { space+=2; }
至
if (x<128) { space++; } else { space+=2; }
我運行了您的代碼,最初它會引發IndexOutOfBoundsException
akber("1.0.128.0.0.5");
因此,請檢查您的代碼是否在某處不消耗異常,例如
try {
exceptionThrowingMethod();
}
catch(Exception e) {
}
如果exceptionThrowingMethod
引發了異常,則代碼將繼續運行,就像未引發exceptionThrowingMethod
一樣(但是exceptionThrowingMethod
沒有成功執行!)
實際上,盡管上面的代碼允許代碼繼續工作,但是它不能解決問題,因為來自函數128的字節值等於負數或類似的值,並且發送了錯誤的值,因此USB硬件接收到錯誤的字符且無法正常工作...通過查看關於stackoverflow上的“ Java 128字節”的其他文章,得出了與128字節以上的字節代碼相同的結果,即負數相同,因此通過反復試驗解決了它,非常煩人-但更改了這一行至:
if (x<128) { space++; } else { space+=2;
int x2 = (x-128)*2;
x=x-(x*2);
if (x<-128) { x=x+x2; }
}
這似乎起作用。 開心的日子,直到發現另一個問題! 對於希望將127以上的值轉換為字節的人們來說,這可能是一個簡單的解決方案,而不是我所看到的,並沒有真正理解的更標准的Java解決方案,因為它更習慣於編寫腳本。 謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.