AtMega2560 si resetta quando la seriale riceve stringa > 62 caratteri

Sto usando l’esempio allegato, adattato per ATMega2560 (3 seriali), per verificare il CRC della stringa ricevuta dalla seriale.
Quando la porzione di stringa sulla quale effettuare il calcolo CRC, supera i 59 caratteri, Arduino si resetta.
Variando la dimensione del buffer di ricezione, non cambia niente.

Da cosa può dipendere?
Dino

questo un esempio del segnale simulato:

$GPGSV,2,1,06,20,67,276,37,01,55,073,41,11,77,140,36,17,29,309,367A
$GPGSV,2,2,06,19,12,168,27,31,16,089,40
7E
$GPRMC,135847.198,A,4424.5162,N,00816.1586,E,0.00,0.00,020307,0A
$GPGLL,4424.5162,N,00816.1586,E,135847.198,A
3B
$GPVTG,0.0,T,M,0.0,N,0.0,K60
$GPIOP,01000000,00010000,0.00,0.00,4.20
75
$GPGGA,135852.198,4424.5162,N,00816.1586,E,1,05,3.4,392.8,M,0.0,M,0.0,00004B
$GPGSA,A,3,20,01,11,17,31,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,4.2,0.0,2.5
34

Questo lo sketch

// Sample sentences to XOR
//$test*16
//$GPRMC,023405.00,A,1827.23072,N,06958.07877,W,1.631,33.83,230613,,,A*42

const byte buff_size = 80; // buffer size must be a constant variable
char buffer[buff_size];
byte index = 0;   // declare all variables that will hold numbers less than '255' as 'byte' data type, because they require only '1-byte' of memory ('int' uses 2-bytes).
byte start_with = 0;
byte end_with = 0;
byte CRC = 0;
boolean data_end = false; // Here we will keep track of EOT (End Of Transmission).

void setup(){
  Serial.begin3(38400);
  Serial.begin(9600);
  Serial.println("Serial communication initialized"); // Print to serial port so we know its working.
}

void loop(){

  while (Serial3.available() > 0){
    char inchar = Serial3.read();
    buffer[index]  = inchar;

    if( inchar == '

){
      start_with = index;
    }

if(inchar == ‘*’){
      end_with = index;
    }

index++;

if(inchar == ‘\n’ || inchar == ‘\r’){ // if ‘new line’ or ‘carriage return’ is received then EOT.
      index = 0;
      data_end = true;
    }
  }

if (data_end == true){
    for (byte x = start_with+1; x<end_with; x++){ // XOR every character in between ’


 and '*'
      CRC = CRC ^ buffer[x] ;
    }
  }

  if(CRC > 0){
    Serial.println(CRC,HEX); // print calculated CS in HEX format.
    CRC = 0; // reset CRC variable
    data_end = false; // Reset EOF so we can process more incoming data.
  }


}

//Elimeléc López - July-19th-2013

Da una prima veloce occhiata, non controlli MAI se index supera per qualche motivo buff_size (80) e quindi rischi di andare a scrivere fuori dal vettore (il C NON controlla se scrivi fuori dal vettore)

Ogni tanto arduino si resettava, così sono partito da stringhe da 44 caratteri e poi aggiungevo un carattere per volta, fino a 59, tutto OK, superando si resetta.

Lo sketch esempio ha due variabili start_with e end_with, ho usato end_with per contare la lunghezza stringa.

?? cosa c'entra ? Tu incrementi SEMPRE index++ fino a che non trovi newline o carriage return (unico if che azzera index=0) Ma tra gli esempi hai: $GPGSA,A,3,20,01,11,17,31,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,4.2,0.0,2.5*34 che è lungo ben 85 caratteri !! Quindi anche se ad un certo punto trovi * per sapere end_witth, comunque il tuo index arriva a 85 e quindi scrivi FUORI dell'array

@ nid69ita Ti ringrazio per il tuo tempo, ma devo sospendere questo thread. L'esempio che ho postato è solo una parte di uno sketch più lungo, sul quale ho rilevato il problema. Adesso, provando lo sketch "base" tutto funziona, devo quindi rivedere lo sketch principale.

Non c'è peggior sordo di chi non vuol sentire.

nid69ita: Da una prima veloce occhiata, non controlli MAI se index supera per qualche motivo 80 e quindi rischi di andare a scrivere fuori dal vettore (il C NON controlla se scrivi fuori dal vettore)

Per precisare non controlli mai se l' indice index non supera 79.

Ciao Uwe

Si, il problema era il superamento delle dimensioni dell'array, ma adesso succede una cosa che non mi spiego. Continuo in altro post --> AtMega2560 e il buffer in ingresso da seriale Dino