关于如何从蓝牙设备接收数据(字符串)的堆栈溢出有很多问题,但我从未见过如何在不检查LF或CR的情况下接收数据(字符串)的问题。
当设备在字符串末尾发送LF时,此代码可以正常工作:
final Handler handler = new Handler();
final byte delimiter = 10; //ASCII code for Line Feed
stopWorker = false;
readBufferPosition = 0;
readBuffer = new byte[1024];
try {
inStream = btSocket.getInputStream();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
}
Thread workerThread = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted() && !stopWorker) {
try {
int bytesAvailable = inStream.available();
if (bytesAvailable > 0) {
byte[] packetBytes = new byte[bytesAvailable];
inStream.read(packetBytes);
for (int i = 0; i < bytesAvailable; i++) {
byte b = packetBytes[i];
if (b == delimiter) {
byte[] encodedBytes = new byte[readBufferPosition];
System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
final String data = new String(encodedBytes, "US-ASCII");
readBufferPosition = 0;
handler.post(new Runnable() {
public void run() {
//test
textview1.setText(data);
}
});
} else {
readBuffer[readBufferPosition++] = b;
}
}
}
} catch (IOException ex) {
stopWorker = true;
}
}
}
});
workerThread.start();
但是发送字符串的设备最后不会发送Line feed和CR。我尝试过很多东西(也是Google的蓝牙指南(http://developer.android.com/guide/topics/connectivity/bluetooth.html))。我希望收到发送到应用程序的所有数据(并用于测试在textview中显示收到的字符串)。
提前致谢, Michielvk
答案 0 :(得分:1)
假设所有字符串都以“1”字符开头,您应该能够通过将 final byte delimiter = 10;
替换为final byte delimiter = 49;
来读取倒数第二个字符串(因为49是ASCII表中“1”的十进制表示。
如果没有后缀分隔符,则无法读取最后一个字符串(并断言您正在读取完整字符串,而不仅仅是一个部分)。
您在此评论供稿中提供了协议的文档。医生说: 结果字符串[...]由38个ASCII字符组成。
根据每个响应由38个ASCII字符组成的事实,您应该能够通过替换来读取所有消息:
if (b == delimiter) {
用:
if (readBufferPosition >= 37) {