我在安卓设备(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];
}
}
这解决了我的问题。关于更好的方法有什么建议吗?