Android中的字节丢失了蓝牙连接

时间:2012-02-20 18:44:39

标签: android stream bluetooth buffer

我遇到了在Android设备(Gingerbread 2.3.1)和PC之间通过蓝牙连接丢弃字节的问题。我接收数据的方式是2字节缓冲区。接收的值是在几分钟内从PC流式传输的(值表示波形)。这里只是几段代码,所以你可以得到这个想法。我的代码基础来自android bluetooth chat sample code

BluetoothSocket socket;

...

mmInStream=socket.getInputStream;

...

byte[] buffer= new byte[2];

...

bytes = mmInStream.read(buffer);

有没有人有这类事情的问题?丢弃的字节似乎在随机时间发生,而在其他时间,接收的值是预期的。我使用2字节缓冲区,因为我收到的值是16位有符号整数。从PC方面我使用RealTerm发送数据的二进制文件。

我的缓冲区是否可能太小而导致丢弃的字节?

由于

2 个答案:

答案 0 :(得分:2)

跟进你的回答。你可以使用一个计数器来记住已读取的字节数,并将其与所需的数字进行比较,并将其用于索引以写入下一个字节。查看http://www.yoda.arachsys.com/csharp/readbinary.html

上的C#版本
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;
  }
}

答案 1 :(得分:1)

我发现了问题所在。我要感谢alanjmcf指出我正确的方向。

我没有通过bytes变量检查来查看mmInStream.read(buffer)返回了多少字节。我只是希望返回的每个buffer都包含2个字节。我解决问题的方法是从buffer获取InputStream之后使用以下代码:

//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];
                    }
                }

这解决了我的问题。有关更好的方法的任何建议吗?