problema serial XBee

buenas
a ver si me pudierais echar una mano porque voy a echar humo jaja

estoy desarrollando un proyecto utilizando antenas XBee el punto central es Arduino MEGA + wireless proto shield + antena XBee s2c coordinaror en api mode 1

para el tratamiento de las tramas de entrada al arduino, al ser posible que llegen varias de golpe y no saber la longitud que tendrán a priori, he decidido que descargue el buffer entero en un string y despues pasarlo dato a dato a un array, despues hacer lo que sea con el array y descargar la siguiente trama del string al array
el problema es que ni he llegado a probar cuando entran varias tramas, solo me lee correctamente la primera trama, ni siquiera comunicando varias tramas en un espacio de tiempo diferente

creo que el problema es que no termino de entender al 100% el buffer del arduino

este es el codigo que estoy probando

#define XBee Serial1


String datosentrada;
byte lectura[30];



void setup() {
  
  Serial.begin(9600);
  XBee.begin(9600);
  Serial.println("Iniciando...");
  datosentrada=("hola");

}

void loop() {
  // put your main code here, to run repeatedly:
int i;
int j;
int k;
j=3000;

  Serial.println(datosentrada); //estas dos lineas son de comprobacion, no estarian en la solucion final
  Serial.println("he imprimido el buffer");

if(XBee.available()){

  datosentrada=XBee.readString();
  delay (10);
  k=0; // la k sirve para marcar el final de una trama antes de leer la siguiente
  i=0;
  do{

  for(i=k;i<(j+k+4);i++){

  lectura[i]=(byte)datosentrada[i];
      if(i==(k+2)){
        j=(int)lectura[1]*256+(int)lectura[2]; //j lee la longitud de la trama XBee, para la primera trama lo hace correctamente
    }
  datosentrada[i]=0x00;

  
  
  /*PROCESAR_DATOS();*/ //aqui iria el codigo que trate las diversas tramas (cuando funcione)
  
  }
    Serial.println(i); //comprobacion
  Serial.println("he impreso i");

  k=i; //marco el punto en el que acaba la trama actual para seguir barriendo el string la siguiente vuelta del do-while desde ese punto

  for(i=0;i<j+4;i++){ //imprimo la trama actual para comprobar que esta bien
  Serial.print(lectura[i],HEX);
  lectura[i]=0;
  Serial.print(" ");
  }
      Serial.println(" ");
      
  }while(datosentrada[k+1]!=0); //compruebo que string no tiene mas componentes

  
 //las siguientes ordenes son de comprobacion para ver que se han borrado
  for(i=0;i<j+4;i++){
  Serial.print(datosentrada[i],HEX);
  Serial.print(" ");
  }
      Serial.println(" ");
  for(i=0;i<j+4;i++){
  Serial.print(lectura[i],HEX);
  Serial.print(" ");
  }
      Serial.println(" ");
  datosentrada = "";
  Serial.println("he salido del do while");
  
  }
  

}

la salida serial seria esta:

Iniciando…
hola
he imprimido el buffer
hola
he imprimido el buffer
20 <–aqui es cuando llega la 1a trama
he impreso i
7E 0 10 90 0 13 A2 0 41 93 12 97 A0 AF 1 68 6F 6C 61 49 <–esta trama es correcta
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
he salido del do while

he imprimido el buffer
4 <–aqui llega la 2a trama
he impreso i
7E 0 0 0 <–solo imprime el primer caracter de la segunda trama (o el 2o tambien ya que es 0)
0 0 0 0
0 0 0 0
he salido del do while

he imprimido el buffer

enviando dos tramas en diversos momentos, la primera trama la imprime perfecta ya que la he comprobado la segunda trama no la imprime, lo que me ralla es que el primer byte si lo imprime

(he probado tambien haciendo un malloc al string y nada)

a ver si alguien supiera como hacerlo un saludo a todos

Tu error comienza en la eleccion de como lees el buffer.

readstring cuando termina? Cuando termina el timeout y que timeout has fijado, ningún por lo tanto esta por defecto en 1 segundo. Usa SetTimeout() para hacerlo.

Si quieres seguir por esta línea de trabajo ajusta SetTimout a digamos 100mseg y ve probando como se comporta, yo leería normalmente los datos y haría la conformación de las tramas porque se como empiezan y terminan.
un Xbee.read() es mas que suficiente.

si, encontré la solucion con el read pero usando tambien el available, (XBee.available()) en este caso, que no sabia que devolvia el tamaño de lo que hay en ese serial, combinando ambas descargo todo con un for
gracias por tu tiempo!

Solucionado entonces?

Trata de colocar la solución para quien se interese por tu problema y pueda usarlo a futuro.