Recepcion de tramas/mensajes desde visualStudio por bluetooth

Hola ;D

Estaba desarrollando un protocolo de comunicacion entre Arduino y VisualStudio, necesito enviar 3 tipos de mensajes cada uno con un tamaño de bytes diferente. Un mensaje tiene tamaño 31, otro 11 y otro 6.

Tengo definidos los formatos de los mensajes en ambas plataformas. Mi idea inicial era recibir los datos por serial (mediante bluetooth, eso es algo que ya tengo y funciona) y almacenarlos en un vector de bytes, una vez obtenidos comparar con los que tengo ya definidos para saber cual es el que me ha llegado (a traves del byte de longitud o el de identificacion).

El problema es que no como configurar para que me lea el tamaño del mensaje que viene por el serial, he intentado utiliar sizeof() pero sin exito. Lo que he logrado hasta el momento y funciona es:

#include <SoftwareSerial.h>
SoftwareSerial ble(10, 11);
#include <EEPROM.h>

int ControlTrama = 0; //controla la cantidad de caracteres leidos del paquete
int EstadoLectura = 0; //indica si se detecto inicio del paquete
byte byte_recibido;

/*Creacion de una union para poder separar el float en bytes*/

union Float_Byte
{
  float datoF;
  byte  datoB[4];
} unionFB;

/*DEFINICION DE LOS BYTES USADOS COMUNES*/
byte Cabecera = 0x1B;
byte Fin = 0x1D;
byte petLec = 0x01;
byte resLec = 0x11;
byte petEsc = 0x02;
byte resEsc = 0x22;
byte checkSum = 0x00;
byte Error = 0xFF;
byte errTramaInalida = 0xF0;
byte errNoerror = 0x00;
byte varPulgar = 0x00;
byte varIndice = 0x01;
byte varMedio = 0x02;
byte varAnular = 0x03;
byte varMenique = 0x04;
/*FIN DEFINICION BYTES DE LAS TRAMAS*/

void setup() {
  Serial.begin(9600);
  ble.begin(9600);
}

void loop() {
  if (ble.available() > 0) {
    
    byte_recibido = ble.read();
    
    if (byte_recibido == Cabecera) {
      Serial.println("byte Start recibido");
      ControlTrama=1; //hemos leido el primer campo de la trama
    }
    if(byte_recibido==0x0B){
      Serial.println("byte Tamaño recibido");
      ControlTrama=2; //hemos leido el segundo campo de la trama
    }
    if(byte_recibido==petLec){
      Serial.println("byte Peticion Lectura recibida de PC");
      ControlTrama=3; //hemos leido el tercero campo de la trama
      peticionLectura();
    }
    else if(byte_recibido==petEsc){
      Serial.println("byte Peticion Escritura recibido de PC")
      ControlTrama=3;
      peticionEscritura();
    }
    if(byte_recibido==varPulgar){
      Serial.println("byte varPulgar");
      ControlTrama=4; //hemos leido el cuarto campo de la trama
    }
    if(byte_recibido==varIndice){
      Serial.println("byte varIndice");
      ControlTrama=5; //hemos leido el quinto campo de la trama
    }
    else if(byte_recibido==varMedio){
      Serial.println("byte varMedio");
      ControlTrama=6; //hemos leido el sexto campo de la trama
    }
    if(byte_recibido==varAnular){
      Serial.println("byte varAnular");
      ControlTrama=7; //hemos leido el septimo campo de la trama
    }
    if(byte_recibido==varMenique){
      Serial.println("byte varMenique");
      ControlTrama=8; //hemos leido el octavo campo de la trama
    }
   if(byte_recibido==errNoerror){
      Serial.println("byte errNoerror");
      ControlTrama=9; //hemos leido el noveno campo de la trama
    }
    if(byte_recibido==checkSum){
      Serial.println("byte chekSum");
      ControlTrama=10; //hemos leido el decimo campo de la trama
    }
    if(byte_recibido==Fin){
      Serial.println("byte Fin");
      ControlTrama=11; //hemos leido el ultimo campo de la trama
    }
    else {
      Serial.println("Trama incorrecta");
      MSGerror(); //llamada a la funcion que envia el mensaje de error a VS
      ble.flush();
      ble.end();
    }
    //Serial.println(ble.read(),HEX);
  }
}

void MSGerror () { //funcion que envia mensaje de la trama de error
  byte msgERROR[6];
  msgERROR[0] = Cabecera;
  msgERROR[1] = 6;
  msgERROR[2] = Error;
  msgERROR[3] = errTramaInalida;
  msgERROR[4] = checkSum;
  msgERROR[5] = Fin;
  for (int i = 0; i < 6; i++) {
    //Serial.println(msgERROR[i],HEX); //comprobar que el mensaje de error que se envia es correcto
    ble.write(msgERROR[i]); //enviamos mensaje de error a VS
  }
}

void RespuestaEscritura(){ //confirmacion de los datos se han leido correctamente
  byte msgRespEscr[11];
  msgRespEscr[0]=Cabecera;
  msgRespEscr[1]=0x0B;
  msgRespEscr[2]=resEsc;
  msgRespEscr[3]=varPulgar;
  msgRespEscr[4]=varIndice;
  msgRespEscr[5]=varMedio;
  msgRespEscr[6]=varAnular;
  msgRespEscr[7]=varMenique;
  msgRespEscr[8]=errNoerror;
  msgRespEscr[9]=checkSum;
  msgRespEscr[10]=Fin;
  for (int i = 0; i < 12; i++) {
    //Serial.println(msgRespEscr[i],HEX); //comprobar que el mensaje de error que se envia es correcto
    ble.write(msgRespEscr[i]); //enviamos mensaje de error a VS
  }
}

/*void RespuestaLectura(){ //se envian los datos que tiene el Arduino actualmente
  byte msgRespLect[31];
  msgRespLect[0]=Cabecera;
  msgRespLect[1]=Cabecera;
  msgRespLect[2]=Cabecera;
  msgRespLect[3]=Cabecera;
  msgRespLect[4]=Cabecera;
  msgRespLect[5]=Cabecera;
  msgRespLect[6]=Cabecera;
  msgRespLect[7]=Cabecera;
  msgRespLect[8]=Cabecera;
  msgRespLect[9]=Cabecera;
  msgRespLect[10]=Cabecera;
  

  for (int i = 0; i < 32; i++) {
    //Serial.println(msgRespEscr[i],HEX); //comprobar que el mensaje de error que se envia es correcto
    ble.write(msgRespLect[i]); //enviamos mensaje de error a VS
  }
}*/

void peticionLectura(){
  
}

void peticionEscritura(){
  
}

void finComunicacion(){
  ble.flush();
  ble.end();
  Serial.println("Se desactivo la comunicacion por envio de trama incorrecta");
}

Lo que pretendia era para hacerlo mas sencillo y adaptable a los 3 tipos de mensajes era, lo mencionado anteriormente de o bien, conocer el tamaño del mensaje que viene por serial, o poder establecer como fin del mensaje el byte llamado FIN, para poder despues leyendo el tamaño entre Cabecera y fin, el tamaño de mensaje para poder compararlo con el que tengo predefinido que debe de ser, para en caso de que no coincida notificar un mensaje de error

Mas recientemente lo que estaba intentando era esto, pero sin exito, (solo cambia el loop):

byte byteRecibido[31];

void loop() {
  ble.listen();
  if (ble.available() > 0) {
    do{
      for(int i=0;i<32;i++) //cambiaria el 32, por sizeof() o funcion que lea el tamaño del buffer serial
      {
        byteRecibido[i]=ble.read();
        Serial.println(byteRecibido[i],HEX);
      }
    }while(ble.read()!=Fin);
  }
}

Si es necesario adjunto alguna parte de codigo mas, ya sea de arduino o de VS

Muchas gracias

Serial.available() devuelve el numero de bytes por leer. Serial.available() - Arduino Reference