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