2012-05-07 5 views
0

データは次のようになります。私が受け取ったシリアルBTデータがなぜチョップアウトされるのですか?私はBTシリアル接続から受信

0 
1 
2 
3 
. 
. 
. 
27 
28 
29 
0 
1 
2 
3 
. 
. 
. 
etc 

しかし、私が実際に取得すると、データの一部が出てみじん切りされています。このように:BTSerialService.java

/** * で

11 
12 
1 
3 
14 
15 
1 
6 
1 
7 
18 
19 
2 
0 

このスレッドは、リモートデバイスとの接続時に実行されます。 *すべての着信と発信を処理します。 */

private class ConnectedThread extends Thread { 
    private final BluetoothSocket mmSocket; 
    private final InputStream mmInStream; 
    private final OutputStream mmOutStream; 


public ConnectedThread(BluetoothSocket socket) { 
    Log.d(TAG, "create ConnectedThread"); 
    mmSocket = socket; 
    InputStream tmpIn = null; 
    OutputStream tmpOut = null; 

    // Get the BluetoothSocket input and output streams 
    try { 
     tmpIn = socket.getInputStream(); 
     tmpOut = socket.getOutputStream(); 
    } catch (IOException e) { 
     Log.e(TAG, "temp sockets not created", e); 
    } 

    mmInStream = tmpIn; 
    mmOutStream = tmpOut; 
} 

public void run() { 
    Log.i(TAG, "BEGIN mConnectedThread"); 
    byte[] buffer = new byte[1024]; 
    //final byte[] buffer = new byte[1024]; 
    int bytes; 

    // Keep listening to the InputStream while connected 
    while (true) { 
     try { 

      // Read from the InputStream 
      bytes = mmInStream.read(buffer); 

      //Send the obtained bytes to the UI Activity 
      mHandler.obtainMessage(FinalSetting.MESSAGE_READ, bytes, -1, buffer).sendToTarget(); 

      } catch (IOException e) { 
      Log.e(TAG, "disconnected", e); 
      connectionLost(); 
      break; 
     } 
    } 
} 

その後FinalSetting.java ケースのメッセージを読んで:

case MESSAGE_READ: 
       int i; 

       byte[] readBuf = (byte[]) msg.obj; 


      // construct a string from the valid bytes in the buffer 
       String readMessage = new String(readBuf, 0, msg.arg1); 
       Log.i(LOG_TAG, readMessage); 

       mTextView.setText(readMessage); 
       String [] numbers = readMessage.split("\n"); 
       int [] intNumber = new int[numbers.length]; 

       for (String number : numbers) { 
        if(number.trim().length()>0){ 

         try{ 
          for (i=0;i<numbers.length;i++){ 
           intNumber[i] = Integer.valueOf(number.trim()); 
           if (intNumber[i]<0 || intNumber[i]>95){ 
            //some action 
           } 
          } 
         } catch (NumberFormatException e){ 
         Log.i(LOG_TAG, "Unable to parse integer" + e); 
         }  
        } 

       } 

       break; 

そして、何LogCatを示しています。

05-06 17:28:07.079: I/HBAS(15090): 10 

05-06 17:28:07.079: I/HBAS(15090): 11 

05-06 17:28:07.079: I/HBAS(15090): 12 

05-06 17:28:07.969: I/HBAS(15090): 1 
05-06 17:28:08.029: I/HBAS(15090): 3 

05-06 17:28:09.019: I/HBAS(15090): 14 

05-06 17:28:09.979: I/HBAS(15090): 1 
05-06 17:28:10.029: I/HBAS(15090): 5 

05-06 17:28:10.989: I/HBAS(15090): 16 

05-06 17:28:12.009: I/HBAS(15090): 17 

05-06 17:28:12.999: I/HBAS(15090): 18 

05-06 17:28:13.999: I/HBAS(15090): 19 

05-06 17:28:14.999: I/HBAS(15090): 20 

05-06 17:28:16.009: I/HBAS(15090): 21 

それでは、どのように誰もが知っていこれを解決する???事前に 感謝...もう一度あなたのデータで

答えて

2

ルック - あなたが実際にそれをすべて受けている、あなたはちょうどあなたがあなたがそれを送った同じサイズのチャンクでそれを受け取ることになります、無効な仮定を行った

05-06 17:28:07.079: I/HBAS(15090): 11 
05-06 17:28:07.079: I/HBAS(15090): 12 
05-06 17:28:07.969: I/HBAS(15090): 1 
05-06 17:28:08.029: I/HBAS(15090): 3 

あなたは '13'を持っています - それは '1'としてから '3'として来ました。

これは完全に許可されており、かなり頻繁に起こると予想されるものです。データを再グループ化し、それを有用な部分に分割する手段を導入する必要があります。

あなたは

0011 
0012 
0013 

などを送信し、常にそれらを解析しようとする前に4バイトのチャンクを組み立てるような何かを行うことができます。輸送が保証されている輸送であれば、これは実際にはうまくいきますが、それは危険だと感じますが、同期が外れた場合、システムがリセットされるか、ランダムに戻ってくるまで同期がとれません。しかし、トランスポートが何かを落としたり並べ替えたりしないことが保証されているならば、理論上はおそらく見られません(エラーハンドラの外で)。

他の一般的なアイデアは、データ中に発生することができない区切り文字を導入することで例えば

11\n 
12\n 
13\n 

そして、解析しようとする前に、終端の改行を探します。これは、あなたが見つけた次の改行に同期させることで、何かを壊して元に戻すことができるという利点があります。

最後に、データ内のすべての値が可能な場合があるため、デリミタ/ターミネータ用に予約することはできません。その場合、特別な意味のシーケンスに先行するエスケープ文字として予約し、その特殊シーケンスの1つがエスケープ文字のリテラルな出現を表すようにするのが一般的です。つまり、引用符で囲まれた文字列の\ nは\\ 『

EDIT \リテラルを意味し、」改行と手段』:ああ、ユーモア、私はバックスラッシュそれらを表示するために取得するために二重のバックスラッシュをエスケープしなければならなかったではなく、nは

+0

おかげでクリス、私が取りましたあなたのアドバイス。私は4バイトのデータを送って区切り文字を作るが、まだ細かく切った。私が間違ってやっていることを正確に私に見せてもらえますか? :D –

+0

完全なメッセージとデリミタを得るまで、受け取った作品を別に収集する必要があります。最も単純なのは、一度に1バイトずつ読むことですが、より効率的な方法もあります。 –

関連する問題