看到下午大神們的回覆, 經過一番思考, 我調整了一下程式, 嘗試將執行緒類別換成普通方法, 也嘗試將拆箱的array透過區域變數的方式進行調整, 也稍微檢查整一下後面接續的程式, 調整完後嘗試打印輸出, 雖然先前的問題已解決了,但程式運行後沒有看見輸出, 鑒於此, 我便開始設置中斷點進行偵錯, 但偵錯到一半, 程式突然終止 ,查看了錯誤訊息 ,發現下圖之情形 ,上網搜尋資料, 所找到的資訊甚少 ,所以上來發問
主程式碼:
byte[] temp = characteristic.getValue();
byte[] increaseCapacity = new byte[temp.length];
System.arraycopy(temp, 0, increaseCapacity, 0, temp.length);
Byte[] byteObjects = new Byte[increaseCapacity.length];
int i = 0;
// Associating Byte array values with bytes. (byte[] to Byte[])
for (byte b : increaseCapacity) {
byteObjects[i++] = b; // Autoboxing.....
}
// System.out.println("原始資料暫存器放入資料前 "+ rawDataList);
rawDataList.addAll(Arrays.asList(byteObjects));
// System.out.println("原始資料暫存器放入資料後 "+ rawDataList);
byte[] bytes = new byte[rawDataList.size()];
int j=0;
for(Byte b: byteObjects)
bytes[j++] = b.byteValue();
// Process p1 = new Process();
// StringBuilder stringBuilder = new StringBuilder(bytes.length);
// for (byte byteChar : bytes)
// stringBuilder.append(String.format("%02X ", byteChar));
// System.out.println(stringBuilder.toString());
size = bytes.length;
codeStartTime = System.currentTimeMillis();
for (int m = 0; m < size; m++) {
if (m + 1 < size && m + 2 < size && m + 3 < size) {
if ((bytes[m] & 0xFF) == 2 && (bytes[m+1] & 0xFF) == 1 && (bytes[m+2] & 0xFF) == 4 && (bytes[m+3] & 0xFF) == 3) {
// System.out.println("跑檢查標頭判斷後原始資料暫存器資料 "+ rawDataList);
len = (bytes[m+8] & 0xFF);
len2 = (bytes[m+9] & 0xFF);
len3 = (bytes[m+10] & 0xFF);
len4 = (bytes[m+11] & 0xFF);
dataLen = len + len2 + len3 + len4 - 4;
if (m+dataLen+12 < size && m+dataLen+13 < size && m+dataLen+14 < size && m+dataLen+15 < size) {
if (bytes[m+dataLen+12] == -1 && bytes[m+dataLen+13] == -1 && bytes[m+dataLen+14] == -1 && bytes[m+dataLen+15] == -1)
{
// System.out.println("跑檢查標尾判斷後原始資料暫存器資料 "+ rawDataList);
threadStartTime = System.currentTimeMillis();
findHeadTail(bytes);
// p1.run();
threadEndTime = System.currentTimeMillis();
threadSeconds = (threadEndTime - threadStartTime) / 1000F;
}
}
}
}
}
codeEndTime = System.currentTimeMillis();
codeSeconds = (codeEndTime - codeStartTime) / 1000F;
// if( codeSeconds > threadSeconds){
// System.out.println("狀況正常 ");
// System.out.println("執行緒共花 "+Float.toString(threadSeconds)+ " seconds. ");
// System.out.println("整段程式共花 "+Float.toString(codeSeconds)+ " seconds. ");
// }
//
// else{
// System.out.println("狀況不對 有問題 ");
// System.out.println("執行緒共花 "+Float.toString(threadSeconds)+ " seconds. ");
// System.out.println("整段程式共花 "+Float.toString(codeSeconds)+ " seconds. ");
// }
方法:
public void findHeadTail(byte[] array) {
byte[] testBytes = new byte[array.length];
int length = 0;
int length2 = 0;
int length3 = 0;
int length4 = 0;
int dataLength = 0;
int size = array.length;
for (int k = 0; k < size; k++) {
if (k + 1 < size && k + 2 < size && k + 3 < size) {
if ((array[k] & 0xFF) == 2 && (array[k+1] & 0xFF) == 1 && (array[k+2] & 0xFF) == 4 && ( array[k+3] & 0xFF) == 3) {
// System.out.println("跑尋找標頭判斷後原始資料暫存器資料 "+ rawDataList);
length = ( array[k+8] & 0xFF);
length2 = (array[k+9] & 0xFF);
length3 = (array[k+10] & 0xFF);
length4 = (array[k+11] & 0xFF);
dataLength = length + length2 + length3 + length4 - 4;
if (k+dataLength+12 < size && k+dataLength+13 < size && k+dataLength+14 < size && k+dataLength+15 < size) {
if (array[k+dataLength+12] == -1 && array[k+dataLength+13] == -1 && array[k+dataLength+14] == -1 && array[k+dataLength+15] == -1)
{
// System.out.println("跑尋找標尾判斷後原始資料暫存器資料 "+ rawDataList);
// System.out.println("正確資料暫存器擷取資料前 "+ realDataList);
// tailCount++;
// System.out.println(tailCount);
for (int p=k+12; p<k+12+dataLength; p++){
testBytes[p] = array[p];
// realDataList.add(rawDataList.get(p));
}
// System.out.println("正確資料暫存器擷取資料後 "+ realDataList);
StringBuilder stringBuilder = new StringBuilder(testBytes.length);
for (byte byteChar : testBytes)
stringBuilder.append(String.format("%02X ", byteChar));
System.out.println(stringBuilder.toString());
// printCount++;
// System.out.println(printCount);
// realDataList.clear();
}
}
}
}
}
}
錯誤訊息: