2013-03-21 5 views
2

У меня возникает любопытная проблема. Я запрограммировал приложение, которое установит связь Bluetooth SPP с ардуином. Устройство Bluetooth на Arduino настроено на скорости 9600 бод. Я могу получить данные от arduino, но, похоже, я получаю некоторый сбой со значениями 0 или высоких пиков. Это довольно раздражает, потому что мне нужно точное значение для графической части, и я знаю, что arduino посылает хорошие данные, потому что я регистрирую, что он отправляет в файл.Bluetooth SPP (последовательный) сбой (Android)

Я ищу, чтобы исправить или понять, почему это происходит, что создание среднего или что-то подобное, что сделает «патч».

Благодарим за помощь.

Вот картинка, которая может объяснить мою проблему, Arduino диапазон данных составляет около 101 до 103:

Screenshot http://s9.postimage.org/n1td3bb4f/Screenshot_2013_03_20_22_30_15_1.png

И вот код, где я создаю соединение и получать данные:

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){ 


        } 
       } 

ответ

0

Я думаю, что ваша ошибка, скорее всего, возникает, когда строка анализируется. Попробуйте тщательно отладить строки

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

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


       } 
      } 
+0

Спасибо за ваш ответ! Но даже строка rmsgBluetooth имеет эту проблему ... Так что в основном проблема в другом месте. Возможно, он находится в области построителя строк, когда я пытаюсь разобрать все байты, чтобы создать строку, но я не могу найти ошибку. – Mathieu660