2015-12-21 72 views
3

我正在創建一個應用程序,通過藍牙串口讀取字符串值。我的數據接收但分兩部分。如果我通過藍牙發送$ F00,A,B,0,M#,它只在第一部分中讀取$,在下一部分中只讀取F00,A,B,0,M#。我在這裏提供了我的代碼。如果我錯了,請糾正我。Android藍牙輸入流不能讀取完整陣列

InputStream inputStream=null; 
    int avilableBytes=0; 
    public ConnectedThread(BluetoothSocket socket){ 
     InputStream temp=null; 
     try{ 
      temp=socket.getInputStream(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     inputStream=temp; 
    } 

    public void run() { 
     try{ 
      int bytes; 
      while (true){ 
       try{ 
        avilableBytes=inputStream.available(); 
        if (avilableBytes>0){ 
         byte[] buffer=new byte[avilableBytes]; 
         bytes=inputStream.read(buffer); 
         final String readMessage=new String(buffer,0,bytes); 
         bt_handler.obtainMessage(handlerState,bytes,-1,readMessage).sendToTarget(); 
         Log.d("PRAVEEN",readMessage); 
        } 
       }catch (IOException e){ 
        e.printStackTrace(); 
       } 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
+0

它不是這樣的,它取決於藍牙,它可以讀取在不同的時間不同的模式。 –

+0

90%的時間我得到了確切的字符串有時會丟失 –

+0

您是否嘗試用我的示例修復代碼? – Majkl

回答

2

數據就像流字節,並且當它帶有幾個字節時不能立即處理。數據不會一次全部作爲單個數據包出現。您必須使用其他byte []緩衝區(MainBuffer),您將逐漸保存傳入字節並將索引移動到該緩衝區中。然後,不時(例如每秒一次的定時器)從主緩衝區獲取數據並對其進行處理。默認情況下,你必須使用分隔符來實現一些數據框(例如,Data * data * data * - 許多方法來做好或不好)。我通過Xamarin在.net中涉及這一點,但只是作爲一個例子,可能是有益的:

更新例如,格式

在ConnectedThread:

  public override void Run() 
      { 
       while (true) 
       { 
        try 
        { 
         int readBytes = 0; 
         lock (InternaldataReadLock) 
         { 
          readBytes = clientSocketInStream.Read(InternaldataRead, 0, InternaldataRead.Length); 
          Array.Copy(InternaldataRead, TempdataRead, readBytes); 
         } 
         if (readBytes > 0) 
         { 
          lock (dataReadLock) 
          { 
           dataRead = new byte[readBytes]; 
           for (int i = 0; i < readBytes; i++) 
           { 
            dataRead[i] = TempdataRead[i]; 
           } 
          } 
          Bundle dataBundle = new Bundle(); 
          dataBundle.PutByteArray("Data", dataRead); 
          Message message = btlManager.sourceHandler.ObtainMessage(); 
          message.What = 1; 
          message.Data = dataBundle; 
          btlManager.sourceHandler.SendMessage(message); 
         } 
        } 
        catch (System.Exception e) 
        { 
         btlManager.btlState = BTLService.BTLState.Nothing;       
        } 
       } 
      } 

在BTLHandler:

  public override void HandleMessage(Message msg) 
      { 
       switch (msg.What) 
       { 
        case 1: 
        { 
         byte[] data = msg.Data != null ? msg.Data.GetByteArray("Data") : new byte[0]; 
         btlService.BTLReceiveData(data); 
        } 
        break; 
       } 
      } 

     public void BTLReceiveData(byte[] data) 
     { 
      lock (dataReadLock) 
      { 
       for (int i = 0; i < data.Length; i++) 
       { 
        dataRead[dataReadWriteCursor] = data[i]; 
        dataReadWriteCursor++; 
       } 
      } 
     } 

在定時器:

    int tmpWriteCursor = dataReadWriteCursor; 
        int tmpReadCursor = dataReadReadCursor; 
        lock (dataReadLock) 
        { 
         int newBytes = dataReadWriteCursor - dataReadReadCursor; 
         for (int i = 0; i < newBytes; i++) 
         { 
          dataReadMain[dataReadReadCursor] = dataRead[dataReadReadCursor++]; 
         }       
        } 


        bool odradkovani = false; 
        string tmpRadek = ""; 
        int lastLineIndex = 0; 
        List<string> list = new List<string>(); 
        for (int i = LastWriteLineIndex; i < tmpWriteCursor; i++) 
        { 
         if (dataReadMain[i] >= 32 && dataReadMain[i] <= 255) 
         { 
          tmpRadek += (char)dataReadMain[i]; 
         } 
         else if (dataReadMain[i] == 13) odradkovani = true; 
         else if (dataReadMain[i] == 10) 
         { 
          if (odradkovani) 
          { 
           odradkovani = false; 
           list.Add(Utils.GetFormatedDateTime(DateTime.Now) + " " + tmpRadek); 
           tmpRadek = ""; 
           lastLineIndex = i + 1; 
          } 
         } 
         else 
         { 
          tmpRadek += "?" + dataReadMain[i].ToString() + "?"; 
         } 
        } 
        WriteDataToLog(list); 
        LastWriteLineIndex = lastLineIndex;