Problema con lectura puerto USB y python

Hola compañeros.

Tengo una arduino Mega 128 con la que registro los datos de varios sensores y los paso por usb (serial) al pc donde esta conectado la arduino. Leo el puerto serie con Python y me ocurre una cosa muy curiosa:

Cuando leo con python el puerto:

Como podéis observar el primer dato:
4@1023 y el último 100@1023

Bien, si ahora leo con el monitor serie del programa arduino:

Y ahora los datos son:
4@632 y el último 100@805

No entiendo porque los datos cambian...

El print en python es de la lectura de:

valor = PuertoSerie.readline()
print (valor)

mientras que el del monitor serie es lo que envía. Donde se produce el cambio de estos datos?

Os paso el código en arduino de donde se envían, aunque no tiene misterio ya que es la lectura de una entrada analógica.

int S4 = analogRead(A0); 
    
    if (S4 != 0) {
      Serial.print("4@");
      Serial.print(S4);
      Serial.print(":");
    } else {
      Serial.print("4@0:");
    }

Gracias por la ayuda.

No hay como postear en un foro para encontrar el problema... en fin.

// LECTURA DEL SERIAL
  if (Serial.available()) {
    while(Serial.available()) {
        i = i +1;
        tmpl[i] = Serial.read();
        leerGS = 1;
      }
      if (leerGS == 1) {
        leerGS = 0;
        // Serial.println("LECTURA SERIAL:");
        // Serial.println(tmpl[1]);
        for (i = 1;i < 33; i++) {
          GS[i] = tmpl[i];
        }
        i = 0;      
      }
  }

Me acabo de dar cuenta quitando y poniendo que esta parte es la que hace que la salida se convierta en 1023, pero no se porque lo hace.

Este código lo que pretende es leer el puerto serie donde recibe los sensores activos para luego leer los datos en caso de estar activos. El envío no se hace siempre, solo cuando hay cambios.

Cuando quito el código del if (leerGS == 1) es cuando funciona.

Pues de lo que me he dado cuenta es que durante dos o tres lecturas si va bien la cosa, pero llega un momento en la que solo marca 1023... ahora estoy peor que antes... en fin.

A ver si alguien me puede echar un cable, porque ahora mismo ando muy perdido.

un saludo.

Bueno, pues por si le pasa a alguien el problema es este if:

if (leerGS == 1) {
        leerGS = 0;
        // Serial.println("LECTURA SERIAL:");
        // Serial.println(tmpl[1]);
        for (i = 1;i < 33; i++) {
          GS[i] = tmpl[i];
        }
        i = 0;      
      }

pero no se porque. Está declarado el GS de igual modo que tmpl, pero con tmpl no tengo ningún problema así que no hago la transición y funciona.

A ver si alguien me puede explicar porque falla con GS.

Un saludo.

Hola.
La verdad es que apenas he podido entender tus explicaciones. Es difícil pillar qué es lo que intentas hacer con una parte del código así aislada. ¿Entiendo que lo que quieres es copiar el array tmpl en GS? Si es así, tal vez el problema sea que la numeración del array empieza en 0 y acaba en (longitud array-1). Por lo que veo tu for empieza en 1 con lo que el primer dato no se copia.
Por intentar ayudar, ya que como te he dicho no he entendido bien tu problema.
Saludos

noter:
Hola.
La verdad es que apenas he podido entender tus explicaciones. Es difícil pillar qué es lo que intentas hacer con una parte del código así aislada. ¿Entiendo que lo que quieres es copiar el array tmpl en GS? Si es así, tal vez el problema sea que la numeración del array empieza en 0 y acaba en (longitud array-1). Por lo que veo tu for empieza en 1 con lo que el primer dato no se copia.
Por intentar ayudar, ya que como te he dicho no he entendido bien tu problema.
Saludos

El array empieza en 1 para ambos, el 0 está vacío en ambos casos.

El problema es que no se porque cuando copio datos a un array los datos del serial.read() cambian en python, porque en arduino funcionan bien. Bueno bien del todo no, porque con el tiempo terminaba colgandose, en 24horas más o menos.

Después de quitar esa parte de código no solo funciona correctamente, si no que además no se cuelga. Ahora en vez de utilizar GS[] para activar/desactivar otras cosas, utilizo tmpl[] y funciona.

Puede ser la utilización en el nombre de mayusculas? porque otra explicación no le doy. Voy a probar.

Probado y nada...

NO se que esta mal en esta función:

if (leerGS == 1) {
        leerGS = 0;
        for (i = 1;i < 33; i++) {
          GS[i] = tmpl[i];
        }
        i = 0;      
 }

EDITO OTRA VEZ:

Creo que has dado con la clave...

El array tiene 32 elementos, entonces el for tiene que terminar en i < 32 no 33...

Ahora con 32 me funciona, vaya lio por un mal calculo. Por si le pasa a otro.

Gracias.