Comunicación serial con bluetooth

Buenas tardes, lo primero me presento, me llamo Guillermo y estoy intentando hacer un proyecto de coche teledirigido por bluetooth con una placa UNO y un HC-06.

El problema que tengo es que no consigo que el arduino me lea las cadenas de números que le mando desde android.

Si hago un bucle que lee el puerto serie e imprime directamente el caracter leido, lo veo bien en el monitor, pero cuando intento agrupar esos caracteres para convertirlos en un entero no hay forma de que lo vea en el monitor (Y tampoco me activa las salidas, ni el pin de activar motor ni el PWM de la velocidad).

La secuencia de la cadena enviada desde android serían 8 caracteres; el primero me indica la dirección (1=adelante o 2=atrás), los tres siguientes la velocidad (de 000 a 100 mapeados hasta 255), el siguiente la dirección de giro (3=izquierda o 4=derecha), y los tres últimos sería el diferencial de velocidad entre los motores para conseguir un giro más suave o más brusco (de 000 a 100 mapeados hasta 255 también).
Seguro que tengo alguna variable declarada que no estoy utilizando, pero es que el código lo he reescrito ya varias veces de distintas formas y bucles, y seguro que me queda algo que no he borrado.

Muchas gracias por vuestro tiempo.

#include <SoftwareSerial.h>

SoftwareSerial BT1 ( 2 , 3 ) ;

String Datosleidos ;
int PinDerFow = 8 ; // Pin activación motor derecho adelante
int PinDerRev = 9 ; // Pin activación motor derecho atras10
int PinIzqFow = 10 ; // Pin activación motor izquierdo adelante
int PinIzqRev = 11 ; // Pin activación motor izquierdo atras
int PinVelder = 5 ; // Pin PWM control motor derecho
int PinVelizq = 6 ; // Pin PWM control motor izquierdo
int Dir ; // Variable que indica la dirección del coche 1=adelante 2=atrás
int Vel ; // Variable de control de velocidad
int Gir ; // Variable que indica la direción de giro 3=izquierda 4=derecha
int Difgir ; // Diferencial de velocidad de los motores para el giro
int VelDif ; // Calculo de la velocidad diferencial de giro
String Direccion ; // Subcadena para la variable Dir
String VelDireccion ; // Subcadena para la variable Vel
String Giro ; // Subcadena para la variable Gir
String DifGiro ; // Subcadena para la variable Difgir

void setup () {

Serial.begin ( 9600 ) ;
BT1.begin ( 9600 ) ;
pinMode ( PinVelder , OUTPUT ) ;
pinMode ( PinVelizq , OUTPUT ) ;
pinMode ( PinDerFow, OUTPUT ) ;
pinMode ( PinDerRev, OUTPUT ) ;
pinMode ( PinIzqFow, OUTPUT ) ;
pinMode ( PinIzqRev, OUTPUT ) ;
}

void loop () {

while ( BT1.available () ) {
    //delay ( 10 ) ;
    if ( BT1.available () > 0 ) {
        char S = BT1.read () ;
        Serial.println (S);
        Datosleidos += S ;
        if ( Datosleidos.length () == 8 ) {
            Direccion = Datosleidos.substring (0 , 1) ;
            Dir = Direccion.toInt () ;
            VelDireccion = Datosleidos.substring ( 1, 4 ) ;
            Vel = VelDireccion.toInt () ;
            Giro = Datosleidos.substring ( 4 , 5 ) ;
            Gir = Giro.toInt () ;
            DifGiro = Datosleidos.substring ( 5 ) ;
            Difgir = (100 - DifGiro.toInt ()) ;
            Serial.print (Dir);
            Serial.print (Vel);
            Serial.print (Gir);
            Serial.print (Difgir);
            Serial.println (Datosleidos);
        }
    }
    
    Vel = map ( Vel , 0, 100, 0, 255);  
    if ( Dir == 1 ) {
      digitalWrite (PinDerRev , LOW ) ;
      digitalWrite (PinIzqRev,  LOW ) ;
      digitalWrite (PinDerFow, HIGH ) ;
      digitalWrite (PinIzqFow, HIGH ) ;
      switch (Gir){
        case 3:
          analogWrite (PinVelizq , (Vel * Difgir )/ 100) ;
          analogWrite (PinVelder , Vel) ;
        case 4:
          analogWrite (PinVelizq , Vel) ;
          analogWrite (PinVelder , (Vel * Difgir )/ 100) ;
      }
    }
    if ( Dir == 2 ) {
      digitalWrite (PinDerFow, LOW ) ;
      digitalWrite (PinIzqFow, LOW ) ;
      digitalWrite (PinDerRev , HIGH ) ;
      digitalWrite (PinIzqRev,  HIGH ) ;
      switch (Gir){
        case 3:
          analogWrite (PinVelizq , (Vel * Difgir )/ 100) ;
          analogWrite (PinVelder , Vel) ;
        case 4:
          analogWrite (PinVelizq , Vel) ;
          analogWrite (PinVelder , (Vel * Difgir )/ 100) ;
      }
    }
//Serial.println (Datosleidos);
Datosleidos = "" ;

}
}

que tal asi?

void loop () {


  if (BT1.available () > 0 ) {
      char S = BT1.read () ;
      Serial.println (S);
      Datosleidos += S ;
      
      if (Datosleidos.length () == 8) {
            Direccion = Datosleidos.substring (0 , 1) ;
            Dir = Direccion.toInt () ;
            VelDireccion = Datosleidos.substring ( 1, 4 ) ;
            Vel = VelDireccion.toInt () ;
            Giro = Datosleidos.substring ( 4 , 5 ) ;
            Gir = Giro.toInt () ;
            DifGiro = Datosleidos.substring ( 5 ) ;
            Difgir = (100 - DifGiro.toInt ()) ;
            Serial.print (Dir);
            Serial.print (Vel);
            Serial.print (Gir);
            Serial.print (Difgir);
            Serial.println (Datosleidos);
    
            Vel = map ( Vel , 0, 100, 0, 255);  
    
            if ( Dir == 1 ) {
              digitalWrite (PinDerRev , LOW ) ;
              digitalWrite (PinIzqRev,  LOW ) ;
              digitalWrite (PinDerFow, HIGH ) ;
              digitalWrite (PinIzqFow, HIGH ) ;
              switch (Gir){
                case 3:
                  analogWrite (PinVelizq , (Vel * Difgir )/ 100) ;
                  analogWrite (PinVelder , Vel) ;
                case 4:
                  analogWrite (PinVelizq , Vel) ;
                  analogWrite (PinVelder , (Vel * Difgir )/ 100) ;
              }
            }
            if ( Dir == 2 ) {
              digitalWrite (PinDerFow, LOW ) ;
              digitalWrite (PinIzqFow, LOW ) ;
              digitalWrite (PinDerRev , HIGH ) ;
              digitalWrite (PinIzqRev,  HIGH ) ;
              switch (Gir){
                case 3:
                  analogWrite (PinVelizq , (Vel * Difgir )/ 100) ;
                  analogWrite (PinVelder , Vel) ;
                case 4:
                  analogWrite (PinVelizq , Vel) ;
                  analogWrite (PinVelder , (Vel * Difgir )/ 100) ;
              }
            }
          //Serial.println (Datosleidos);
          Datosleidos = "" ;
      }
  }
}

Hola surbyte muchas gracias por tu respuesta, ese es uno de las docenas de códigos que he probado, y no me funciona.
Pero esta mañana indagando un poco más (ya llevo casi tres semanas con esto) he encontrado otra función de String que me ha parecido interesante y acabo de probarla ahora mismo.

¡¡¡Y FUNCIONA!!!
Copio el código por si a alguno le pudiera ser de interés en algún proyecto:

char S [8];
String Datosleidos ;
int PinDerFow = 8 ; // Pin activación motor derecho adelante
int PinDerRev = 9 ; // Pin activación motor derecho atras10
int PinIzqFow = 10 ; // Pin activación motor izquierdo adelante
int PinIzqRev = 11 ; // Pin activación motor izquierdo atras
int PinVelder = 5 ; // Pin PWM control motor derecho
int PinVelizq = 6 ; // Pin PWM control motor izquierdo
int Dir ; // Variable que indica la dirección del coche 1=adelante 2=atrás
int Vel ; // Variable de control de velocidad
int Gir ; // Variable que indica la direción de giro 3=izquierda 4=derecha
int Difgir ; // Diferencial de velocidad de los motores para el giro
int VelDif ; // Calculo de la velocidad diferencial de giro
String Direccion ; // Subcadena para la variable Dir
String VelDireccion ; // Subcadena para la variable Vel
String Giro ; // Subcadena para la variable Gir
String DifGiro ; // Subcadena para la variable Difgir


void setup()
   {
       Serial.begin(9600);
       BT1.begin(115200);
   }

void loop ()  {

        if (BT1.available() > 0){ 
           BT1.readBytes ( S , 8 );
           Serial.println ( S );
           for ( int i=0; i<8; i ++){
              Datosleidos += S[i];
              //Serial.print (Datosleidos);
           }   
           Direccion = (Datosleidos.substring (0,1));
           VelDireccion = (Datosleidos.substring (1,4));
           Giro = (Datosleidos.substring (4,5));
           DifGiro = (Datosleidos.substring (5));



           Dir = Direccion.toInt ();
           Vel = VelDireccion.toInt ();
           Gir = Giro.toInt ();
           Difgir = DifGiro.toInt ();

           Serial.println (Dir);
           Serial.println (Vel);
           Serial.println (Gir);
           Serial.println (Difgir);
           
           Datosleidos = "";
           Direccion = "";
           VelDireccion ="";
           Giro = "";
           DifGiro ="";

Con la función "Serial.readBytes" y luego "troceando" la cadena con "string.substring" y la convierto en entero con "string.toInt"

Luego si me da tiempo termino el código y lo pruebo con mi coche.

Muchas gracias por tu tiempo.