Hola
Estoy realizando un montaje con Arduinos (un UNO y un Mini), el UNO genera paquetes de datos que contiene 12 bytes, los 4 primeros indican la acción y los otros 8 indican los datos.
Como ejemplo:
Paquete 1: 0x00, 0x1F, 0x01, 0x00, 0x24, 0x06, 0x2D, 0x70, 0x18, 0x020, 0x34, 0x21
Paquete 2: 0x01, 0x1C, 0x10, 0x03, 0x32, 0x00, 0x2F, 0x60, 0x51, 0x060x32, 0x23
Estos paquetes quiero mandarlos al Arduino Mini para que los procese.
Las conexiones son:
UNO Tx -> Mini Rx
UNO Rx -> Mini Tx
Es decir, que los comunico por el puerto hardware.
Como dice Luis Llamas, los programadores “mayores” utilizan bytes para comunicarse, por lo que me puse manos a la obra. En el UNO se montan los 12 bytes en una matriz y se envían al serial con Serial.write(matriz). En el Mini, se utiliza lo siguiente
If(Serial.available()>12{
Char read_buffer[12] ={0x00};
Serial.readBytes(read_buffer,sizeof(read_buffer));
//proceso de los bytes
}
Bien, pero para que esto funcione los datos tienen que estar coordinados, es decir que si el UNO está encendido y luego se enciente el Mini, el read_buffer se llena con los 12 primeros que pueden ser una parte de un paquete y otra del siguiente, por ejemplo
0x2D, 0x70, 0x18, 0x020, 0x34, 0x210x01, 0x1C, 0x10, 0x03, 0x32, 0x00, 0x2F
Lo cual la interpretación es ya errónea siempre. Como los bytes pueden tener cualquier valor, no puedo utilizar uno para indicar el inicio y otro para terminarlo, o por lo menos no veo como hacerlo. ¿Cómo se coordinan los envíos de bytes por el Serial?
Otra cosa que veo, es que ambos Serial está ajustado a 115200 baudios y con esta velocidad read_buffer contiene bytes que no corresponden con lo que tiene que ser, es decir, lee mal los bytes. Si bajo la velocidad a 9600, se leen perfectamente, pero se nota la diferencia en tiempo de ejecución.
Como no sabia resolver el problema, cambié el método de envío, pasando los bytes a una cadena String (con ‘\n’ final) con los datos en modo texto, lo cual es más fácil de procesar, pero más lento, ya que en el UNO hace el cambio de byte a String y en el Mini, al revés.
If(Serial.available()>24{
String read_buffer;
Serial.readStringUntill(‘\n’);
//proceso de los bytes
}
Aquí vuelvo a tener el problema de sincronización, el primer paquete está incompleto, pero sólo es el primero, los siguientes ya los lee correctamente, salvo que tengo el mismo problema con la velocidad, con 115200baudios lee muchas veces una cadena de caracteres “raros” y no debía ser ya que readStringUntill espera a que llegue el carácter final o el timeout del Serial, pero aseguro que el timeout no llega, ya que lo tengo en 1s.
Las cuestiones que no he logrado encontrar (o no he sabido buscar) y por eso pregunto por aquí son:
¿Cómo se sincronizan los paquetes de datos cuando se trabaja con bytes?
¿Por qué afecta la velocidad del Serial a la lectura? Cuando monitorizo el envío del UNO con el Serial del IDE se reciben los datos correctamente?
Gracias de antemano por vuestro tiempo