Buenas, ante todo agradecer la ayuda a todos los usuarios del foro y creadores, que conseguis poco a poco que todo sea mucho más accesible y facil de entender.
A continuación os hago una consulta que lleva varios días dandome vueltas y no entiendo el motivo...
Tengo el GPS Ublox 6M, modelo GY-GPS6MV2, conectado al Arduino UNO. Lo he conectado al puerto serial y realizo la lectura del puerto serie con el siguiente código:
#include <SoftwareSerial.h>
int i=0;
byte v[91];
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available()>0){
for(i=0;i<92; i++){
v[i]=Serial.read();
}
Serial.print("nnEl mensaje es ");Serial.print("n");
for (i=0;i<92;i++){
Serial.print(v[i],HEX);
}
}
}
El mensaje que he configurado tiene 92 bytes, del GPS al Arduino se envía lo siguiente:
0000 B5 62 01 07 54 00 20 06 2F 0F E1 07 02 0E 16 2D
0010 16 07 F8 FF 3E 02 51 62 01 00 00 00 06 00 94 13
0020 C5 FC 3E 48 8A 15 69 77 01 00 63 C4 00 00 00 C4
0030 92 85 80 59 73 5E 00 00 00 00 00 00 00 00 00 00
0040 00 00 00 00 00 00 00 00 00 00 20 4E 00 00 80 A8
0050 12 01 0F 27 00 00 84 D3 11 00 6A 96
Y lo que recibo es...
El mensaje es
B5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B
El mensaje es
62175402062FFE172E162D167F8FF3E251621000609413C5FC3E488A1569771063C4000C492858059735E0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B
Al ver eso... me di cuenta, que el problema era el tamaño que agrego... que lo que envio supera el buffer del arduino y el tamaño no debe ser siempre 92, ya que el buffer lo mismo a almacenado más o menos en cada pasada, por lo que se me ocurrió hacer la siguiente prueba para comprobar que es lo que le llega realmente...
#include <SoftwareSerial.h>
int i=0, capacidad;
byte v[91];
void setup() {
Serial.begin(9600);
}
void loop() {
if(Serial.available()>0)
{
Serial.print("nLa capacidad a leer del buffer es:");
capacidad=Serial.available();Serial.print(capacidad); Serial.print("n");
for(i=0;i<capacidad; i++){
v[i]=Serial.read();
}
Serial.print("Vamos a imprimir lo leido hasta el tamano de V= "); Serial.print(capacidad); Serial.print("n");
for (i=0;i<capacidad;i++){ //Imprimir en pantalla el mensaje
Serial.print(v[i],HEX);
}
Serial.println("");
}
}
Y para mi sorpresa es que el paquete de datos que envia el GPS (los 92 bytes) lo recibe arduino en 3 bloques con los siguientes tamaños: 1,60 y 30 o 1 61 y 29 (varían según le parece...).
Y no entiendo el motivo. Se recibe de la siguiente forma:
La capacidad a leer del buffer es:1
Vamos a imprimir lo leido hasta el tamano de V= 1
B5
La capacidad a leer del buffer es:61
Vamos a imprimir lo leido hasta el tamano de V= 61
6217540606639FE172E16382A71803F2D6D3FBFF00609413C5FC3E488A1569771063C400076B58680E7405F00000000
La capacidad a leer del buffer es:29
Vamos a imprimir lo leido hasta el tamano de V= 29
00000000000204E0080A8121F270084D31107694
0000 B5 62 01 07 54 00 60 66 39 0F E1 07 02 0E 16 38
0010 2A 07 18 00 3F 02 D6 D3 FB FF 00 00 06 00 94 13
0020 C5 FC 3E 48 8A 15 69 77 01 00 63 C4 00 00 00 76
0030 B5 86 80 E7 40 5F 00 00 00 00 00 00 00 00 00 00
0040 00 00 00 00 00 00 00 00 00 00 20 4E 00 00 80 A8
0050 12 01 0F 27 00 00 84 D3 11 00 76 94
El GPS funciona bajo protocolo UBX en mi caso: 9600bps, 8 bits de datos, sin paridad y 1 bit de stop, que es el mismo bajo el que funciona Arduino por defecto: Serial.begin(9600,SERIAL_8N1).
Alguien podría ayudarme a entender porque ocurre esto o que es lo que no hago bien, si hay algun otro método... o algo para mensajes mayores del buffer.
Muchísimas gracias a todos.
Un saludo