title: Send continuous bluetooth stream from Android to Arduino
body: <p>I'm working on a simple vehicle project, made with Arduino Uno and controlled by an Android App.</p>
  
  <p>My matter is to send continuous stream from the app to my bluetooth module (HC-06) on Arduino.
  I did it with onTouch events and a new thread called from my main activity, but something is obviously wrong because the app seems to send each command as i want it to do, but the Arduino waits until the finger is off the button and receives all data (from action.down to action.up) at a time.</p>
  
  <p>To understand :
  I update a small string like this "1255090" each time a command button is action.down or action_move, convert it to bytes and send it via bluetooth.
  If i briefly click on the button, Arduino will receive the correct string "1255090", but if i maintain my finger on the button, Arduino waits for the string, and when i release the button, Arduino receives for example "125509012540901253090125209012510901252090" (depending on how long i clicked).</p>
  
  <p>Android activity (partial)</p>
  
  <pre><code>drive.setOnTouchListener(new View.OnTouchListener() {
      public boolean onTouch(View v, MotionEvent m) {
          if (m.getAction() != MotionEvent.ACTION_UP) {
              accelerer(); // inscreases the speed
              str_flux(); // constructs the string
              byte[] bytes = new byte[0];
              try { bytes = flux.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
              sendReceiveBT.write(bytes); // calls the thread's method
          } else{ralentir();}
          return true;
      }
  });
  </code></pre>
  
  <p>Thread</p>
  
  <pre><code>package com.*.vehicle.util;
  import android.bluetooth.BluetoothSocket;
  import android.util.Log;
  import java.io.IOException;
  import java.io.OutputStream;
  public class SendReceiveBytes implements Runnable {
      private BluetoothSocket btSocket;
      private OutputStream btOutputStream = null;
      String TAG = "SendReceiveBytes";
      public SendReceiveBytes(BluetoothSocket socket) {
          btSocket = socket;
      try { btOutputStream = btSocket.getOutputStream(); } catch (IOException streamError) { Log.e(TAG, "Error when getting input or output Stream"); }
      }
      public void run() {
          byte[] buffer = new byte[1024]; 
          int bytes; 
      }
      public void write(byte[] bytes) {
          try {
              btOutputStream.write(bytes); // Send the bytes to Arduino
              btOutputStream.flush(); // don't know if it really does something...
              Log.e(TAG, "SUCCESS !");
          }
          catch (IOException e) {
              Log.e(TAG, "Error when writing to btOutputStream");
          }
      }    
  }
  </code></pre>
  
  <p>Arduino loop</p>
  
  <pre><code>void loop() {    
      s = Serial.readString();  // 1255090  
      if (s!=""){
          Serial.println(s);
          bt_direction = s.substring(0,1).toInt();        
          bt_speed = s.substring(1,4).toInt();    
          bt_angle = s.substring(4,7).toInt();    
          s = "";
      } else{ 
          if (bt_speed&gt;0){
              for(int i=bt_speed;i&gt;=0;i--){bt_speed--;}
          }
          else{ bt_speed = 0; }
      }  
      if (bt_direction==1){bt_dir = true;} else{bt_dir = false;}
      if (bt_speed==0){stop_motor();} else{dc_motor(bt_speed, bt_dir);}  
      Serial.println(bt_direction);
      servo_turn(bt_angle);
  }
  </code></pre>