2015-12-24 18 views
0

我正在使用蓝牙串行连接在android应用程序和微控制器之间进行通信。我可以在应用程序和MC之间进行通信。但是我从MC发来的信息分成两部分。例如,如果我通过蓝牙发送$F05,A,B,C,0#,它会将我的消息分成两部分,内容如下。第一部分是$,其余部分是F05,A,B,C,0#。你可以看到我的日志猫输出如下。Bluetooth InputStrem读取两部分的字节

12-24 10:40:19.926 17999-18183/? V/PRAVEEN: $ 
12-24 10:40:20.027 17999-18183/? V/PRAVEEN: F15,A,0,0,0# 

我发送这个消息在整个螺母android分裂成两部分。我的代码是

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

请帮助我获取实际发送的字符串。谢谢。

+0

是的,它发生了好几次,有时你会得到像'$ F05',',A,B,C,0#'这样的数据。 –

+0

@NigamPatro是否有解决方法或破解如何实现? –

+0

直到现在我正在寻找,但我们可以做一些类似的事情,我们可以附加一些特殊字符来区分消息块。 –

回答

2

假设你使用rfcomm,你可以这样做。在我的例子中,我发送两个有效载荷:第一个是消息的大小,第二个是消息本身。

while (true) { 
      Log.d(TAG, "listening to InputStream"); 
      try { 
       // Read from the InputStream 
       int messageSizeBufferSize = mmInStream.readInt(); 
       Log.d(TAG, messageSizeBufferSize+"<mSBS"); 
       Log.d(TAG, "Run"); 

       if(messageSizeBufferSize == 0) 
        continue; 
       Log.d(TAG, "Message of size "+messageSizeBufferSize); 
       bytes = 0; 
       buffer = new byte[messageSizeBufferSize]; 
       while(bytes < messageSizeBufferSize) { 
        Log.d(TAG, "Reading bits "+bytes+" for mmInStream"); 
        bytes += mmInStream.read(buffer,bytes,messageSizeBufferSize - bytes); 
       } 
       Log.d(TAG, "Read RFCOMM message completely"); 
       String message = new String(buffer); 
       Log.d(TAG, "Read "+message); 
      } catch (IOException e) { 

       break; 
      } 
     }