【问题标题】:Byte Dropped Over Bluetooth Connection in Android在 Android 中通过蓝牙连接丢弃的字节
【发布时间】:2012-02-20 18:44:39
【问题描述】:

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

BluetoothSocket socket;

...

mmInStream=socket.getInputStream;

...

byte[] buffer= new byte[2];

...

bytes = mmInStream.read(buffer);

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

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

谢谢

【问题讨论】:

  • 你在检查'bytes'的值吗?
  • 不,我不是。 mmInStream.read(buffer) 返回时缓冲区是否可能未满?

标签: android stream bluetooth buffer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-09
      • 2019-01-29
      • 2014-03-27
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多