我遇到了在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发送数据的二进制文件。
我的缓冲区是否可能太小而导致丢弃的字节?
由于
答案 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];
}
}
这解决了我的问题。有关更好的方法的任何建议吗?