我遇到以下问题: 我通过蓝牙插座连接两个设备,一个平板电脑安卓和一个蓝牙设备,如读卡器条码,到目前为止还可以,问题是,当蓝牙设备读取条形码并将其发送到平板电脑时,条形码有时候它分两部分发送,例如,如果我读了内容为“212154521212”的条码,平板电脑收到“2121”,“54521212”之后,任何人都知道告诉我该怎么办才能避免这种情况?
先谢谢。
我的代码从蓝牙设备读取数据:
[代码] 私有类ConnectedThread扩展了线程{
private final InputStream mmInStream;
private BluetoothSocket socket;
public ConnectedThread(BluetoothSocket socket) {
this.socket = socket;
InputStream tmpIn = null;
try {
tmpIn = socket.getInputStream();
} catch (IOException e) {
new LogDeErrosRodesTablet(e);
Log.e(TAG, e.getMessage());
Log.e(TAG, "Erro no construtor da classe ConnectedThread.");
}
mmInStream = tmpIn;
}
public void run() {
// continua lendo o inputstream até ocorrer um erro
while (true) {
int read = 0;
byte[] buffer = new byte[128];
do {
try {
read = mmInStream.read(buffer);
Log.e(TAG, "read: " + read);
final String data = new String(buffer, 0, read);
Log.e(TAG, "data: " + data);
//TODO
//send data only (bar code) only after read all
Bundle bundle = new Bundle();
bundle.putString(TelaInserirPedido.CODIGO_BARRAS, data);
Message message = new Message();
message.what = TelaInserirPedido.MSG_COD_BARRAS;
message.setData(bundle);
//Send a message with data
handler.sendMessage(message);
} catch(Exception ex) {
read = -1;
return;
}
Log.e(TAG, "inside while.");
} while (read > 0);
Log.e(TAG, "outside of while.");
}
}
public void cancel () {
try {
socket.close ();
} catch ( IOException e) { }
}
}
[/代码]
答案 0 :(得分:1)
这不是蓝牙错误。蓝牙设备正在将所有数据发送到您的应用程序,但您在收到所有数据之前正在读取流。如果你知道数据的确切长度,你可以在读取之前检查流上的可用字节数();您可以连接所有读取的结果,直到达到已知的终点。或者你可以在任意时间延迟,并希望在那段时间内完成传输。
您将在收集输入字符串的while循环之后创建Bundle和Message,因为在该循环结束之前您不知道整个字符串。 (除非您期望在一个连接中使用多个字符串,在这种情况下,您需要更复杂的代码来处理部分数字)。
答案 1 :(得分:0)
使用OutputStream.flush()强制发送所有数据。