我希望你能帮助我让这个蓝牙接收器正常工作。 我要接收的字符串是由带有 HC-06 蓝牙模块的 Arduino Uno 发送的,我可以在多个蓝牙终端应用程序中接收它。
我尝试接收的字符串如下所示:#id=3,temp=100,maxtemp=103,rpm=27,maxrpm=27*
但我只收到这样的数据:
07-21 12:45:17.959 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: 4*
07-21 12:45:18.141 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: p=83maxtemp=149rpm=34maxrpm=34*
07-21 12:45:18.471 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: 34*
07-21 12:45:18.583 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: 2maxrpm=34*
07-21 12:45:18.761 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: 4*
07-21 12:45:18.911 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: 34*
07-21 12:45:19.237 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: m=17maxrpm=34*
07-21 12:45:19.388 31174-31174/fabian.d.de.rc_telemetrie_test D/BT﹕ Empfangen: =29maxrpm=34*
这是我的蓝牙处理程序。我希望你能帮助我找到问题所在。
bluetoothIn = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) {
String readMessage = (String) msg.obj;
recDataString.append(readMessage);
int endOfLineIndex = recDataString.indexOf("*");
if (endOfLineIndex > 0) {
String dataInPrint = recDataString.substring(0, endOfLineIndex);
txtString.setText("Daten Empfangen: = " + dataInPrint);
int dataLength = dataInPrint.length();
txtStringLength.setText("Datenlänge: = " + String.valueOf(dataLength));
Log.d("BT", "Received: " + recDataString);
if (recDataString.charAt(0) == '#')
{
Log.d("BT", "Matching string received: " + recDataString);
String[] parts = recDataString.split(",");
for (String part : parts) {
if (part.startsWith("temp=")) {
strTemp = part;
strTemp = strTemp.substring(5);
}
else if (part.startsWith("maxtemp=")) {
strMaxtemp = part;
strMaxtemp = strMaxtemp.substring(8);
}
else if (part.startsWith("rpm=")) {
strRpm = part;
strRpm = strRpm.substring(4);
}
else if (part.startsWith("maxrpm=")) {
strMaxrpm = part;
strMaxrpm = strMaxrpm.substring(7);
}
}
sensorView0.setText(" Temperatur: " + strTemp + "°C"); //update the textviews with sensor values
sensorView1.setText(" maximale Temperatur: " + strMaxtemp + "°C");
sensorView2.setText(" RPM: " + strRpm + "/min");
sensorView3.setText(" maximale RPM: " + strMaxrpm + "/min");
}
recDataString.delete(0, recDataString.length()); //clear all string data
}
}
};
编辑:这是我的连接线程:
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
//creation of the connect thread
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[256];
int bytes;
// Keep looping to listen for received messages
while (true) {
try {
bytes = mmInStream.read(buffer); //read bytes from input buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
bluetoothIn.obtainMessage(handlerState, bytes, -1, readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}
//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
Toast.makeText(getBaseContext(), "Connection Failure", Toast.LENGTH_LONG).show();
finish();
}
}
}
最佳答案
显然你的逻辑似乎没问题。来自 frarugi87 的提示可能会使它更稳定。
在过去使用 BlueToothChat 示例代码时,我遇到了类似的问题。确定的根本原因是:
- 语句
bytes = mmInStream.read(buffer);
是一个阻塞
称呼。它仅在通过
接收到一些数据后才返回到下一行 蓝牙。 两次连续返回之间的时间是不可预测的, 并且每次返回的字符数也是随机的。
当此类事件传递给处理程序时, UI 线程无法以相同的速度处理这些事件。
得到的解决方案是:
- 不要每次都将字符串发送给处理程序,即避免在每次阻塞调用返回后发送字符串。
- 相反,继续累积传入的字符串,直到识别出完整的数据包。
- 只将完整的数据包传递给处理程序。这减少了 UI 线程的调用频率。
关于java - 安卓蓝牙字符串接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31537815/