Fallo en la comunicación Serial

Buenas tardes,

Tengo un fallo en la comunicación Serial entre el Arduino y el PC.

Para entrar en situación, explico un poco que trato de hacer. Mi programa es una modificación del famoso FreeIMU de Fabio Varessano. Consiste en ampliar la transferencia de información de Quaterniones a éstos, la medida de temperatura y la medida de los acelerómetros; para más adelante, hibridarlo, mediante un filtro de Kalman, con un GPS para montar un sistema completo de navegación.

Pues bien, a la hora de compilar compila perfectamente y cuando conecto el arduino [u]sólo escribe 4 líneas o 5 del mensaje completo, después deja de imprimir[/u]. Si enviío los 4 Quaterniones, nunca deja de imprimir(a no ser que lo desconecte, obviamente), si pruebo con éstos 4 y 2 lecturas de los acelerómetros también imprime indefinidamente; pero cuando imprimo los 3, deja de funcionar. He probado todas las combinaciones posibles y diferentes tipos de datos en los que almacenar las lecturas de los acelerómetros pero no consigo enviarlos indefinidamente. Pareciera que algo va creciendo y llena alguna memoria; pero es imposible porque no tiene sentido que con 5 o 6 datos (float) imprima indefinidamente y con 7 sólo 4 líneas.

Gracias, un saludo

Porción del código que realiza la función de escritura en el serie. Ahí están metidos todos los datos como dos vectores “q” y “acel” de 4 y 3 componentes respectivamente, ambos float; también intenté utilizar int16_t (formando 3 variables, una para cada eje del vector aceleración)

/*---------------------SENDQUAT---------------------*/

void sendQuat(){
  
  // following conversion adapted from Invensense's TeaPot example
  q[0] = (long) ((((unsigned long) processed_packet[0]) << 8) + ((unsigned long) processed_packet[1]));
  q[1] = (long) ((((unsigned long) processed_packet[2]) << 8) + ((unsigned long) processed_packet[3]));
  q[2] = (long) ((((unsigned long) processed_packet[4]) << 8) + ((unsigned long) processed_packet[5]));
  q[3] = (long) ((((unsigned long) processed_packet[6]) << 8)  + ((unsigned long) processed_packet[7]));
  for(int i = 0; i < 4; i++ ) {
    if( q[i] > 32767 ) {
      q[i] -= 65536;
    }
    q[i] = ((float) q[i]) / 16384.0f;
  }
  
  serialPrintFloatArr(q, 4);
//  Serial.print("\n");
  
  acel[0] = AcX;
  acel[1] = AcY;
  acel[2] = AcZ;
//  Serial.print(acel,3);
  serialPrintFloatArr(acel,3);
  
//  Serial.print(AcX);
//  Serial.print(",");
//  Serial.print(AcY);
//  Serial.print(",");
//  Serial.print(AcZ); 
//  Serial.print(",");
//  Serial.print(Tmp/340.00+36.53); Serial.print(",");
  
  Serial.print("\n");
}

/*--------------------------------------------------*/

salida puerto serie.png

Sigo añadiendo pruebas...sketch montado en Arduino MEGA2560 y ocurre lo mismo...

Estimado:

Yo no entiendo bien que estas haciendo. pero seguramente el código (del que acá solo hay una parte) será largo. ¿no estarás corto de memoria ram? Tene presente que cuando te quedas sin memoria (me ha pasado) el programa se comporta muy raro, se traba, y hasta que no te das cuenta de que se trata uno da mil vueltas.

Saludos

Como siempre solemos decir, es difícil ver el problema sin el código completo pero, tal vez, podría ser un problema de sobrellenado del buffer serial. Intenta poner un Serial.flush() tras cada envío de dato por serial. Si eso solventara el problema, luego podrías ir quitando y dejarlos sólo en lugares "estratégicos".

Gracias por las contestaciones.

Lo del Flush lo había pensado, pero no se por qué no lo probé…Lo acabo de probar y sigue sin andar. Cuelgo todos los documentos del código.

Añadiendo más explicaciones a el texto y el por qué de mi proyecto: Se que existe mucha información sobre las Unidades de Medidas Inerciales de OpenSource por ello me decidí por FreeIMU iniciado por Fabio. Debido a su fallecimiento, numerosas personas continuaron con su trabajo modificando su código y haciéndolo libre; es aquí donde radica el problema. El código actual que encuentro no funciona de ninguna de las maneras, dando numerosos errores que para mi son imposibles de subsanar debido a que no sólo hay que entender qué hizo y qué quizo hacer Fabio sino, a todos aquellos que posteriormente lo modificaron. Por suerte tengo una versión extremadamente extensa que carece de librerías que extrae los Quaternions para su posterior procesado a Euler Angles, pero me es insuficiente, dado que, por el mismo canal serie (rf) necesito transmitir medidas de acelerómetros(para integrarlas y sacar un tracker de posición) y medidas de GPS para hacer de waypoint (o puntos de reinicio) para reiniciar el inercial mediante un filtro de Kalman…

Gracias a todos se que no es sencillo pero valoro vuestra ayuda.

Si tuviérais un código que funcionara más simplificado que el que subiré lo agradecería. Adjunto todo mi código; me reitero no usa la librería FreeIMU, lo ideal sería tener uno con dicha librería que funcionara

FreeIMU_Funciones_Separadas.zip (12.9 KB)