Byte Dropped Over Bluetooth Connection in Android



我在安卓设备(Gingerbread 2.3.1)和PC之间的蓝牙连接中遇到了一些字节丢失的问题。我接收数据的方式是在2字节的缓冲区中。正在接收的值在几分钟内从PC流式传输(值表示波形)。这里只是一些代码片段,所以您可以了解这个想法。我的代码基础来自android蓝牙聊天示例代码。

BluetoothSocket socket;

mmInStream=socket.getInputStream;

byte[] buffer= new byte[2];

bytes = mmInStream.read(buffer);

有人对这种事情有意见吗?丢弃的字节似乎是随机发生的,而在其他时间接收到的值与预期的一样。我使用2字节的缓冲区,因为我接收的值是16位有符号整数。从PC端的东西,我正在使用RealTerm发送二进制文件的数据。

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

感谢

跟进您的答案。您可以只使用计数器来记住已经读取的字节数,并将其与所需的数字进行比较,还可以将其用于写入下一个字节的索引。请参阅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;
  }
}

我发现了问题所在。我要感谢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];
                    }
                }

这解决了我的问题。关于更好的方法有什么建议吗?

相关内容

  • 没有找到相关文章

最新更新