mega2560 e shield GSM/GPRS/GPS ripete setup dopo due loop

Buongiorno ragazzi,

sto ancora lavorando sulla ricezione delle coordinate gps e devo dire che pian piano ho raggiunto risultati inaspettati, ovviamente grazie soprattutto a voi.
Utilizzo Arduino Mega2560, lo shield GSM/GPRS/GPS SHIELDV2 comprato da futura elettronica ed il SIM908.

Il problema che ho è il seguente.
Con lo sketch di seguito riportato riesco a ricevere le coordinate ed a visualizzarle su monitor seriale, ma analizzando meglio il tempo che intercorre tra la visualizzazione dei dati ricevuti al primo ciclo ed il secondo, mi sono accorto che servono in media 3 minuti.
Volendo ridurre tale valore ho iniziato a studiare i tempi necessari per eseguire le varie istruzioni accorgendomi che al secondo ciclo di loop arduino sembra che si resetti, infatti riesegue il setup; in particolare questo succede quando arriva all’istruzione “gps.getPar(lon,lat,alt,time,vel);”: al primo ciclo stampa correttamente i dati ricevuti su monitor seriale, mentre al secondo li stampa parzialmente e poi riesegue il setup. Credo sia proprio questo che faccia perdere tempo e, considerando che il setup deve essere eseguito solo all’avvio, credo ci sia qualcosa che non funzioni.

Pensando ci fosse qualche problema di saturazione di memoria, ho studiato i concetti relativi ai due buffer per ogni seriale e della RAM che viene allocata nella hardwareserial.cpp. Ho capito il concetto di ring buffer e provato a variare le dimensioni, ottenendo sempre la stampa di porzioni di dati.
Infine, sapendo che lo shield comunica con la mega tramite la porta seriale 1, ho provato a cancellare il buffer usando vari metodi trovati sul forum (serial1.available, serial1.read ecc ecc), ma mi sono accorto che l’istruzione serial1.available non è mai verificata, ovvero sembra non ci sia niente nel buffer e di conseguenza non svuoto nulla.
Domande:

  • Come è possibile tutto ciò se comunque a monitor viene sempre stampata qualcosa?
  • Forse dovrei svuotare contemporaneamente i buffer della serial0 e della serial1, ma resta comunque il perchè non leggo niente dalla serial1?
  • Il mio obbiettivo è quello di far entrare nel buffer della serial1 una ricezione di dati gps alla volta, per questo avevo pensato di svuotarlo alla fine di ogni loop
#include "SIM900.h"
#include "stdlib.h"
#include "gps.h"

GPSGSM gps;

int numdata;
char msg[51];

char lon[15];
float lon_db;
char lat[15];
float lat_db;
char lat_conv[10];
char lon_conv[10];
char variab[50];
char alt[15];
char time[20];
char vel[15];

char stat;
boolean started=false;

void setup() 
{
  Serial.begin(9600);
  Serial.println(F("GSM Shield testing."));
  if (gsm.begin(4800)){
    Serial.println(F("\nstatus=GSM READY"));
    started=true;  
  }
  else Serial.println(F("\nstatus=IDLE"));
  
  if(started){
    //GPS attach
    if (gps.attachGPS())
      Serial.println(F("status=GPS READY"));
    else Serial.println(F("status=ERROR"));
    delay(20000);	//Time for fixing
    stat=gps.getStat();
	if(stat==1)
		Serial.println(F("NOT FIXED"));
	else if(stat==0)
		Serial.println(F("GPS OFF"));
	else if(stat==2)
		Serial.println(F("2D FIXED"));
	else if(stat==3)
		Serial.println(F("3D FIXED"));
	delay(5000);
    
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
    delay(5000);
    //Read until serial buffer is empty.
    gsm.WhileSimpleRead();
        Serial.println(F("FINE SETUP"));
  }
};

void loop() 
{
  Serial.println(F("inizio loop"));
  serialhwread();
};

void serialhwread(){
        stat=gps.getStat();
	if(stat==1)
		Serial.println(F("NOT FIXED"));
	else if(stat==0)
		Serial.println(F("GPS OFF"));
	else if(stat==2)
		Serial.println(F("2D FIXED"));
	else if(stat==3)
		Serial.println(F("3D FIXED"));
   // }
   delay(5000);
    //Get data from GPS
    gps.getPar(lon,lat,alt,time,vel);
    lon_db=convert(lon);
    lat_db=convert(lat);
    //Serial.print("LON: ");
    Serial.println(lon_db,4);
    Serial.print(F("LAT: "));
    Serial.println(lat_db,4);
    
    dtostrf(lat_db, 2, 4, lat_conv);
    dtostrf(lon_db, 2, 4, lon_conv);
    
	strcat(variab,"lat=");
	strcat(variab,lat_conv);
	strcat(variab,"&long=");
	strcat(variab,lon_conv);
        strcat(variab,"&username=mbistato");
    Serial.print(F("variab:"));
    Serial.println(variab);


int strpos(char *str, char *target) {
char *res=0;
res = strstr(str, target);
if (res == NULL) return false;
else return res - str;
}


float convert(char* str){
float mmmmmm;
float dd;
int pos;
pos=strpos(str,".");
char dd_str[pos-1];
dd_str[0]='\0';
char mmmmmm_str[6];
mmmmmm_str[0]='\0';
for (int i=0; i<pos-2; i++){
dd_str[i]=str[i];
}
dd_str[pos-2]='\0';
dd=atof(dd_str);
mmmmmm_str[0]=str[pos-2];
mmmmmm_str[1]=str[pos-1];
mmmmmm_str[2]=str[pos];
mmmmmm_str[3]=str[pos+1];
mmmmmm_str[4]=str[pos+2];
mmmmmm_str[5]=str[pos+3];
mmmmmm_str[6]='\0';
mmmmmm=atof(mmmmmm_str);
float result;
result=dd+mmmmmm/60;
return result;
}

Ciao
David

Le cause di un resset e percui riesecuzione del setup possono essere varie.

1) problemi di alimentazione. L' elettronica consuma troppa corrente e la tensione si abbassa. Potresti notarlo sul LED PWR che potrebbe spegnersi o diventare piú debole per un breve istante. MA non é detto che riesci a vederlo.

2) Errore di SW. Tipicamente se vai fuori indice di un array oppure fai un errore coi puntatori. Se per esempio in un array a 3 elementi scrivi nel 4o elemento e sovrascrivi una variabile che sta nella RAM dopo l'array. esempio:

char mmmmmm_str[6];
...
mmmmmm_str[0]=str[pos-2];
mmmmmm_str[1]=str[pos-1];
mmmmmm_str[2]=str[pos];
mmmmmm_str[3]=str[pos+1];
mmmmmm_str[4]=str[pos+2];
mmmmmm_str[5]=str[pos+3];
mmmmmm_str[6]='\0';

Qua definisci l' array mmmmmm_str di 6 elementi e ne usi 7. Non ho controllato tutto lo sketche lo lascio fare a te.

3) Usi troppa RAM. Vedo che ne sei cosciente e hai usato la macro F().

Ciao Uwe

uwefed:
Le cause di un resset e percui riesecuzione del setup possono essere varie.

  1. problemi di alimentazione. L’ elettronica consuma troppa corrente e la tensione si abbassa. Potresti notarlo sul LED PWR che potrebbe spegnersi o diventare piú debole per un breve istante. MA non é detto che riesci a vederlo.

Io utilizzo un alimentatore di 12 V 2A che dovrebbe essere sufficiente alimentare il tutto.

uwefed:
2) Errore di SW. Tipicamente se vai fuori indice di un array oppure fai un errore coi puntatori. Se per esempio in un array a 3 elementi scrivi nel 4o elemento e sovrascrivi una variabile che sta nella RAM dopo l’array. esempio:

char mmmmmm_str[6];


mmmmmm_str[0]=str[pos-2];
mmmmmm_str[1]=str[pos-1];
mmmmmm_str[2]=str[pos];
mmmmmm_str[3]=str[pos+1];
mmmmmm_str[4]=str[pos+2];
mmmmmm_str[5]=str[pos+3];
mmmmmm_str[6]=’\0’;




Qua definisci l' array mmmmmm_str di 6 elementi e ne usi 7. Non ho controllato tutto lo sketche lo lascio fare a te.

Ho risolto definendo char mmmmmm_str[7] e svotando ad ogni ciclo la variabile “variab”.

Grazie mille!

Prego.