2012-02-20 82 views
0

我在通過Android設備(薑餅2.3.1)和PC之間的藍牙連接丟棄字節時遇到了一些問題。我接收數據的方式是在一個2字節的緩衝區中。接收的值在幾分鐘內從PC流出(值表示波形)。這裏只是一些代碼片段,所以你可以明白這個主意。我的代碼的基礎是從android bluetooth chat sample code字節在Android中通過藍牙連接丟棄

BluetoothSocket socket; 

...

mmInStream=socket.getInputStream; 

...

byte[] buffer= new byte[2]; 

...

bytes = mmInStream.read(buffer); 

有沒有人有這種類型的東西的問題?丟失的字節似乎隨機發生,而在其他時間收到的值與預期相同。我正在使用2字節緩衝區,因爲我收到的值是16位有符號整數。從PC端使用RealTerm發送數據的二進制文件。

是否有可能我的緩衝區太小,導致丟失的字節?

謝謝

+1

您是否檢查'字節'的值? – alanjmcf 2012-02-20 20:44:52

+0

不,我不是。當mmInStream.read(buffer)返回時緩衝區可能不滿嗎? – gtdevel 2012-02-20 20:52:14

回答

1

我已經找到了問題所在。我想感謝alanjmcf指引我朝着正確的方向前進。

我沒有通過bytes變量檢查來查看mmInStream.read(buffer)返回了多少個字節。我只是希望每個buffer返回將包含2個字節。我解決這個問題的方法是使用下面的代碼從InputStream得到buffer回來後:

//In the case where buffer returns with only 1 byte 
       if(lagging==true){ 
        if(bytes==1){ 
         lagging=false; 
         newBuf=new byte[] {laggingBuf, buffer[0]}; 
         ringBuffer.store(newBuf); 
        }else if(bytes==2){ 
         newBuf=new byte[] {laggingBuf, buffer[0]}; 
         laggingBuf=buffer[1]; 
         ringBuffer.store(newBuf); 
        } 
       }else if(lagging==false){ 
        if(bytes==2){ 
         newBuf = buffer.clone(); 
         ringBuffer.store(newBuf); 
        }else if(bytes==1){ 
         lagging=true; 
         laggingBuf=buffer[0]; 
        } 
       } 

這個固定我的問題。任何關於更好方法學的建議?

+0

請參閱C#版本 – alanjmcf 2012-02-23 19:11:24

2

繼承你的答案。您可以使用計數器來記住已讀取的字節數,並將其與希望的數字進行比較,並將其用於索引以寫入下一個字節。看到一個C#版本在http://www.yoda.arachsys.com/csharp/readbinary.html

public static void ReadWholeArray (Stream stream, byte[] data) 
{ 
    int offset=0; 
    int remaining = data.Length; 
    while (remaining > 0) 
    { 
    int read = stream.Read(data, offset, remaining); 
    if (read <= 0) 
     throw new EndOfStreamException 
     (String.Format("End of stream reached with {0} bytes left to read", remaining)); 
    remaining -= read; 
    offset += read; 
    } 
}