如何通过蓝牙读取所有字节?

我有一个应用程序,使用蓝牙从其他设备接收一些数据(字节)。 一切进展顺利,但是我一起收到所有字节的小问题。 收到字节后,我会在Toast上显示它们,以便testing它们。 当其他设备一起发送10个字节(例如:“ABCDEFGHIJ”)时,程序将只读取第一个字节“A”,并显示在Toast上,然后进入第二次迭代,读取另外9个字节,并显示“ BCDEFGHIJ“在吐司上。 这是我的代码:

byte[] buffer = new byte[1024]; // Read 1K character at a time. int bytes = 0; // Number of bytes. while(true) { try { // Read from the InputStream. bytes = bInStream.read(buffer); // Send the obtained bytes to the MainActivity. mainActivityHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget(); } catch(IOException e) { connectionLost(); break; } } 

在MainActivity中,我有:

 // The Handler that gets information back from the BluetoothManager. private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch(msg.what) { case MESSAGE_READ: byte[] readBuf = (byte[]) msg.obj; // construct a string from the valid bytes in the buffer. String readMessage = new String(readBuf, 0, msg.arg1); Toast.makeText(MainActivity.this, readMessage, Toast.LENGTH_SHORT).show(); break; // ... } } }; 

我怎样才能一起收到所有的字节?

Solutions Collecting From Web of "如何通过蓝牙读取所有字节?"

嗯,最有可能的罪魁祸首就是你发送信息的方式。 你的接收没有任何问题,它会收到尽可能多的字节(高达1024)。

如果您无法控制消息的发送方式,则可能一次只能读取一个字节,然后在您点击预定义的终止符时发送处理程序消息。 例如:“ABCDEFGHIJ#”,其中#是结束符。

 String msg = ""; byte ch; while((ch=mInStream.read())!='#') { bytes++; msg+=ch; } 

蓝牙连接是基于stream而不是基于分组的。 没有保证或企图保持分组化。 所以任何数量的写入都会导致任意数量的读取,只是字节stream保证是正确的。 如果您需要检测数据包,则需要提供自己的数据包结构来包装数据。 例如,在每个数据包之前添加一个长度字段,以便您可以在接收端进行重构。

@broody接受的答案是正确的。 但是,如果数据本身包含“#”,则可能难以获取数据。 所以根据我的最佳方法是在将数据发送到您的Android应用程序的设备上附加'\ n'后跟'\ r'(或任何其他不太可能用作数据的字符参考ASCII表格 )。 它只是作为换行并标记数据的结束。

例如:ABCDEFGH \ n \ r

那么你的代码可以是这样的:

 byte[] buffer = new byte[1024]; while (true) { // Read from the InputStream buffer[bytes] = (byte) mmInStream.read(); // Send the obtained bytes to the UI Activity if ((buffer[bytes] == '\n')||(buffer[bytes]=='\r')) { mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget(); bytes=0; } else bytes++; } 

希望这有助于关心

处理长于缓冲区的消息的方法(可能是危险的,因为如果从不清除,可能占用你的内存)是以块处理它们:

 String inString = ""; byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; // bytes returned from read() while (true) { try { bytes = mmInStream.read(buffer); String chunk = new String(buffer, 0, bytes); if(chunk.contains(";")) { inString += chunk.substring(0,chunk.indexOf(';')); Message msg = new Message(); msg.obj = inString; handler.sendMessage(msg); inString = chunk.substring(chunk.indexOf(';')); } else { inString += chunk; } } catch (IOException e) { break; } }