Recibir datos con readStringUntil(';').toInt();

Buenas, estoy recibiendo 4 datos por serial por medio de un bluetooth divididos por ; y para ello estoy utilizando la función readStringUntil(’;’).toInt(); sin embargo cuando hago un código de sólo lectura con esta instrucción todo sale perfecto, los datos los divide tal cual como llegan y se asignan a las variables como es, pero cuando realizo mi código completo el cual es un control para manejar un carro vía bluetooth y con un acelerómetro que me coloco en la mano y así según el movimiento de la mano puedo guiarlo, yo creo una función solo de lectura y cada vez que entra a esa función las lecturas las coloca en desorden por lo que no queda cada lectura donde va y no entiendo por qué, colocaré los dos código que estoy usando. Aclaro que estoy visualizando los datos en una pantalla LCD 16x2.

Aquí el código de sólo recibir los datos.

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
SoftwareSerial BT(4, 5); // RX, TX
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int dato;
int dato2;
int dato3;
int dato4;

void setup() {
  Serial.begin(9600);
  BT.begin(9600);
  lcd.begin(16,2);

}

void loop() {
  if(BT.available() > 0){
    //char dato = BT.read();
    lcd.setCursor(0,0);
    dato = BT.readStringUntil(';').toInt();
    Serial.print("Bobina1: ");
    Serial.print(dato);
    Serial.print(" ");
    dato2 = BT.readStringUntil(';').toInt();
    Serial.print("Bobina2: ");
    Serial.print(dato2);
    Serial.print(" ");
    dato3 = BT.readStringUntil(';').toInt();
    Serial.print("Bobina3: ");
    Serial.print(dato3);
    Serial.print(" ");
    dato4 = BT.readStringUntil(';').toInt();
    Serial.print("MQ: ");
    Serial.print(dato4);
    Serial.println(" ");
    lcd.clear();
    lcd.print(dato);
    lcd.print(dato2);
    lcd.print(dato3);
    lcd.print(dato4);
    delay(100);
    }
  

}

Aquí el código completo.

#include <SoftwareSerial.h>
#include <LiquidCrystal.h>

SoftwareSerial BT(4, 5); // RX, TX
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int PinEjeX = 0;
int PinEjeY = 1;
int PinEjeZ = 2;
int EjeX;
int EjeY;
int EjeZ;
int SW = 2;
int Pulse;
int Buzzer = 3;

int Bobina1;
int Bobina2;
int Bobina3;
int MQ;

void setup() {

  lcd.begin(16, 2);
  Serial.begin(9600);
  BT.begin(9600);
  pinMode(3,OUTPUT);
}

void loop() {
  EjeX = Lectura(PinEjeX);
  EjeY = Lectura(PinEjeY);
  EjeZ = Lectura(PinEjeZ);
  LeerBT();

  //Adelante
  if (EjeY <= 300) {
    BT.print("OK");
    BT.println("F");
    BT.print("OK");
    BT.println("F");
    BT.print("OK");
    BT.println("F");
   
       Serial.println("Adelante");
    LeerBT();
  }

  //Atras
  if (EjeY >= 400) {
    BT.print("OK");
    BT.println("B");
    Serial.println("Atras");
    BT.print("OK");
    BT.println("B");
    Serial.println("Atras");
    BT.print("OK");
    BT.println("B");
    Serial.println("Atras");
   
    LeerBT();
    
  }

  //Derecha
  if (EjeX <= 300) {
    BT.print("OK");
    BT.println("R");
    Serial.println("Derecha");
    BT.print("OK");
    BT.println("R");
    Serial.println("Derecha");
    BT.print("OK");
    BT.println("R");
    Serial.println("Derecha");
   
    LeerBT();
  }

  //Izquierda
  if (EjeX >= 400) {
    BT.print("OK");
    BT.println("L");
    Serial.println("Izquierda");
    BT.print("OK");
    BT.println("L");
    Serial.println("Izquierda");
    BT.print("OK");
    BT.println("L");
    Serial.println("Izquierda");
   
    LeerBT();
  }

  //Stop
  if (EjeX > 300 && EjeX < 400) {
    if (EjeY > 300 && EjeY < 400) {
      BT.print("OK");
      BT.println("D");
      Serial.println("Stop");
      BT.print("OK");
      BT.println("D");
      Serial.println("Stop");
      BT.print("OK");
      BT.println("D");
      Serial.println("Stop");
     
      LeerBT();
    }
  }

  //Lectura del pulsador
  Pulse = digitalRead(SW);
  if (Pulse = 0) {
    BT.println("W");
    BT.println("W");
    BT.println("W");
  }
  
  else {
    BT.println("w");
    BT.println("w");
    BT.println("w");
  }

}

//---------------------------------------------------------------------------------------------

int LeerBT(){
  
  if(BT.available() > 0){

    Bobina1 = BT.readStringUntil(';').toInt();
    Serial.print(Bobina1);
    Bobina2 = BT.readStringUntil(';').toInt();
    Serial.print(Bobina2);
    Bobina3 = BT.readStringUntil(';').toInt();
    Serial.print(Bobina3);
    MQ = BT.readStringUntil(';').toInt();
    Serial.println(MQ);

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("B1: ");
    lcd.print(Bobina1);
    lcd.print(" B2:");
    lcd.print(Bobina2);
    lcd.print(" B3:");
    lcd.print(Bobina3);
    lcd.setCursor(0,1);
    lcd.print("MQ: ");
    lcd.print(MQ);

//    if(Bobina1 = 1){
//      digitalWrite(Buzzer, 1);
//    }
    
//    if(Bobina2 = 1){
//      digitalWrite(Buzzer, 1);
//    }
//    
//    if(Bobina3 = 1){
//      digitalWrite(Buzzer, 1);
//    }

  }
    
}
    

int Lectura(int ValorEje) {
  long var = 0;
  long suma = 0;
  long Prom = 0;
  int i = 0;
  for (i = 0; i <= 99; i++) {
    var = analogRead(ValorEje);
    suma += var;
  }
  Prom = suma / i;
  return Prom;
}

Espero puedan ayudarme.

Muchas gracias

Hablas de 4 datos pero no nos cuentas de cuantos bytes cada dato.

Suponiendo que cada uno es de 2 bytes x 4 = 8 mas 3 separadores ; son 11 bytes.

Porque no esperas a que lleguen para empezar a leer ?

if (BT.available() >= 11){
   ...
}

Recuerda que el buffer max es 64 bytes y que por defecto el readStringUntil() acaba luego de 1 seg.

En todo caso cambia setTimeout()