Java Android蓝牙字符串接收器

Java Android蓝牙字符串接收器,java,android,bluetooth,arduino,Java,Android,Bluetooth,Arduino,我希望你能帮助我让这个蓝牙接收器正常工作。 我将要接收的字符串由一个带有HC-06蓝牙模块的Arduino Uno发送,我可以在几个蓝牙终端应用程序中接收它 我尝试接收的字符串如下:#id=3,temp=100,maxtemp=103,rpm=27,maxtrm=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

我希望你能帮助我让这个蓝牙接收器正常工作。 我将要接收的字符串由一个带有HC-06蓝牙模块的Arduino Uno发送,我可以在几个蓝牙终端应用程序中接收它

我尝试接收的字符串如下:
#id=3,temp=100,maxtemp=103,rpm=27,maxtrm=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();

        }
    }
}

显然你的逻辑似乎很好。来自的提示可能会使它更稳定

在过去使用BlueToothChat示例代码时,我遇到了类似的问题。确定的根本原因是:

  • 语句
    bytes=mmInStream.read(缓冲区)是一个阻塞
    呼叫只有在通过
    蓝牙
  • 两次consequetive返回之间的时间不可预测, 每次返回的字符数也是随机的

  • 当这些事件传递给处理程序时,则 UI线程不能以相同的速度处理这些事件

解决办法是:

  • 不要每次都向处理程序发送字符串,即避免在每次阻塞调用返回后发送字符串
  • 相反,继续累积传入字符串,直到识别出完整的数据包
  • 只将完整的数据包传递给处理程序。这减少了UI线程的调用频率

  • 你能把通过BT到达的数据通过流读取的代码粘贴到哪里吗?这是消息传递给处理程序的地方。此外,看看中的问题和答案将帮助您理解您面临的问题-我已经添加了代码,希望任何人都能在那里找到问题。谢谢你的链接,但不幸的是,我不知道该怎么办。只是一些想法。。首先,我会在((endoflindex=recDataString.indexOf(“*”)>0)时执行
    ,而不是在(endoflindex>0)时执行
    ;这样,如果您收到多个数据包,您将设法查看所有数据包。此外,我将替换
    recDataString.delete(0,recDataString.length())带有
    recDataString.delete(0,endOfLineIndex),因此您不会删除未分析的数据。然后,我将删除所有字符,直到第一个字符是
    (或者字符串为空。对于您的问题…可能您有竞争条件…尝试在退出之前查看函数是否被调用两次(例如,放入
    Log.d(“Entered”)
    handleMessage
    函数的开头,然后在其结尾添加一个
    Log.d(“退出”)
    ,然后检查是否只有进入,然后是退出,并且没有多个进入。。。