2013-03-21 68 views
1

我有一個代碼下面,我發送到串行USB端口... 它正在工作,現在它不是! 的akber()功能死去如果錯誤的字符串發送...Java寫入字節到串口USB

如果我送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)); 

我需要它來處理「數據」字符串中任意數字的組合,因此它將它們轉換爲正確的字節類型並寫入端口...它不是我的代碼,牛逼很理解,但仍需要修復它:-)

+1

你說'akber()函數死了'是什麼意思?有沒有堆棧跟蹤? – linski 2013-03-21 11:08:44

+0

如果我做System.out.println(「akberData =」+ akber(「1.0.2.0.0.5」));它返回akberData = [B @ 101e178 ...如果我做System.out.println(「akberData =」+ akber(「1.0.128.0.0.5」)); 它返回null,並且該函數在該點處停止。 ...實際上,它似乎超過128的值,如果低於128,函數不會返回任何結果...? – user2194607 2013-03-21 11:20:18

回答

1

改變這一行:

if (x<256) { space++; } else { space+=2; } 

if (x<128) { space++; } else { space+=2; } 

我跑你的代碼,原來它拋出一個IndexOutOfBo undsException爲

akber("1.0.128.0.0.5"); 

因此請檢查您的代碼是否在某處使用異常,

try { 
    exceptionThrowingMethod(); 
}  
catch(Exception e) { 
} 

如果exceptionThrowingMethod拋出異常的代碼會繼續,如果異常被拋出不(但exceptionThrowingMethod沒有成功地執行!)

0

實際上,儘管上述允許代碼繼續工作,它並沒有解決問題,因爲來自128以上函數的字節值是負值等價物或發生了錯誤的值,所以USB硬件接收到不正確的字符並且不能正常工作......通過查看其他關於「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解決方案。 謝謝。