android - 蓝牙SPP(串行)故障(Android)

标签 android sockets bluetooth spp

我遇到一个奇怪的问题。我已经编写了一个应用程序,该应用程序将与arduino建立蓝牙SPP链接。 Arduino上的蓝牙设备配置为9600波特。我可以从arduino接收数据,但是似乎我收到了一些值为0或高峰值的故障。这很烦人,因为我确实需要图形部分的精确值,并且我知道arduino发送好的数据是因为我将其发送的内容记录在文件中。

我正在寻找解决或理解为什么会发生这种情况的方法,而不是创建平均值或类似的方法来制作“补丁”。

谢谢你的帮助。

这是一张可以解释我的问题的图片,arduino数据范围在101到103左右:

Screenshot

这是我创建连接并接收数据的代码:

private class ConnectedThread extends Thread {
    private final DataInputStream mmInStream;
    private final DataOutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }

        mmInStream = new DataInputStream(tmpIn);
        mmOutStream = new DataOutputStream(tmpOut);
    }

    public void run() {
        byte[] buffer = new byte[1024];  // buffer store for the stream
        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);        // Get number of bytes and message in "buffer"
                hBluetooth.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget();        // Send to message queue Handler
            } catch (IOException e) {
                break;
            }
        }
    }

private void connectDevice() {


    BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);

    try {
        btSocket = createBluetoothSocket(device);
    } catch (IOException e) {
        errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
    }


    mBluetoothAdapter.cancelDiscovery();


    // Establish the connection.  This will block until it connects.
    Log.d(TAG, "...Connecting...");
    try {
      btSocket.connect();
      Log.d(TAG, "....Connection ok...");
      // Create a data stream so we can talk to server.
      Log.d(TAG, "...Create Socket...");

      mConnectedThread = new ConnectedThread(btSocket);
      mConnectedThread.start();
      mActionBar.setSubtitle("Connecté");

      //If fail, we disconnect or display an error warning regarding the situation
    } catch (IOException e) {
      try {
        btSocket.close();
        mActionBar.setSubtitle("Deconnecté");
      } catch (IOException e2) {
        errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
      }
    }

    return;
    }  

最后是处理程序:
hBluetooth = new Handler() {
    public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
        case RECEIVE_MESSAGE:                                                   // If we receive a message
            byte[] readBuf = (byte[]) msg.obj;
            String stringIncome = new String(readBuf, 0, msg.arg1);             // Create string from byte array
            stringBuilder.append(stringIncome);                                             
            int endOfLineIndex = stringBuilder.indexOf("\r\n");                 // Determine the end-of-line
            if (endOfLineIndex > 0) {                                           // If we are at the end-of-line we parsed all the data that was sent
                rmsgBluetooth = stringBuilder.substring(0, endOfLineIndex);     // The string is extracted in a string object rmsgBluetooth
                stringBuilder.delete(0, stringBuilder.length());                


                if(btSocket != null && btSocket.isConnected()){                 


                //Here we send the value of the string to a txtbox  
                txtArduino.setText("Arduino: " + rmsgBluetooth); 




                if(rmsgBluetooth.matches("-?\\d+(\\.\\d+)?")) {                
                    try{

                   sensorReading = Float.parseFloat(rmsgBluetooth);
                    }catch(NumberFormatException e){


                    }
                }   

最佳答案

我认为您的错误很可能是在解析字符串时出现的。尝试仔细调试线路

           if(rmsgBluetooth.matches("-?\\d+(\\.\\d+)?")) {                
                try{

               sensorReading = Float.parseFloat(rmsgBluetooth);
                }catch(NumberFormatException e){


                }
            }

关于android - 蓝牙SPP(串行)故障(Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15538575/

相关文章:

android - 当我们点击退出时如何为对话框编写代码以及在android中为对话框xml编写代码?

Android:如何从应用程序中安全地删除 sharedUserId(API 级别 29 中已弃用)?

Android 数据绑定(bind) : Example vs Reality

带有 TCP/IP 通信的 javascript 十六进制代码

c - 服务器不接受来自客户端的连接以从文件读取数据

android - android内部类避免内存泄漏

java - DataOutputStream 和 ObjectOutputStream 有什么区别?

android - 无法使用蓝牙 HC-06 发送数据 - 应用程序停止工作

android - 两个设备之间的蓝牙数据传输不起作用

android - 如何请求OBD参数并接收它们