2012-02-20 45 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; 
    } 
}