Arduino MEGA e SIM900 problema con metodo httpGET

Ciao a tutti,
sono alcuni giorni che sto sbattento la testa su un problema molto fastidioso, credo legato alla libreria che sto usando per comunicare con il modulo SIM900.

Spero di fornirvi tutti i dati utili per poter ricevere un consiglio positivo.

Sto usando Arduino MEGA e un modulo SIM900 acquistato in rete (GPRS Shield Arduino UNO) Foto in allegato

https://www.amazon.it/gp/product/B01F3IA00S/ref=pd_sbs_328_3?ie=UTF8&psc=1&refRID=3BQ7FGJF05F5X0N8ZW7Z

Sto utilizzando la libreria messa a disposizione da GSMLib
http://www.gsmlib.org/download.html

Dal punto di vista hw sembra tutto ok, ovvero il collegamento tra i pin 7 e 8 del modulo GPRS e la seriale hardware di Arduino (pin 18 e 19) sono ok. L'alimentazione al modulo GPRS è assicurata da un alimentatore a 5V e uscita max di 2A. La massa di Arduino e la massa del modulo GPRS sono collegate.

Dal punto di vista software, dopo aver modificato alcuni file della libreria per utilizzare Arduino Mega e l'hardware serial, direi che ci siamo. Lanciando lo sketch di esempio per l'invio di SMS sono riuscito a far comunicare arduino e lo shield e sono riuscito a mandare sms.

IL PROBLEMA.

Il problema nasce quando uso lo sketch di esempio per una semplice apertura di pagina web. Vi inserisco il codice completo e vi spiego quello che ho notato.

#include "SIM900.h"
//#include <SoftwareSerial.h>
#include "inetGSM.h"
//#include "sms.h"
//#include "call.h"

//To change pins for Software Serial, use the two lines in GSM.cpp.

//GSM Shield for Arduino
//www.open-electronics.org
//this code is based on the example of Arduino Labs.

//Simple sketch to start a connection as client.

InetGSM inet;
//CallGSM call;
//SMSGSM sms;

char msg[2000];
volatile int numdata;
char inSerial[50];
volatile int i=0;
volatile boolean started=false, connectAPN=false;

void setup() 
{
  //Serial connection.
  Serial.begin(4800);
  Serial.println("GSM Shield testing.");
  //Start configuration of shield with baudrate.
  //For http uses is raccomanded to use 4800 or slower.
  if (gsm.begin(4800)){
    Serial.println("\nstatus=READY");
    started=true;  
  }
  else Serial.println("\nstatus=IDLE");
  
    if(started){
    //GPRS attach, put in order APN, username and password.
    //If no needed auth let them blank.
    if (inet.attachGPRS("wap.tim.it", "", ""))
      Serial.println("status=ATTACHED");
    else Serial.println("status=ERROR");
    delay(1000);
    
    //Read IP address.
    gsm.SimpleWriteln("AT+CIFSR");
      
    delay(5000);
    //Read until serial buffer is empty.
    gsm.WhileSimpleRead();

    //TCP Client GET, send a GET request to the server and
    //save the reply.
    numdata=inet.httpGET("www.google.com", 80, "/", msg, 2000);
    //Print the results.
    Serial.println("\nNumber of data received:");
    Serial.println(numdata);  
    Serial.println("\nData received:"); 
    Serial.println(msg); 
    
    
  }
};

void loop() 
{
  
  //Serial.println("\n In the loop\n");
  //Read for new byte on serial hardware,
  //and write them on NewSoftSerial.
  serialhwread();
  //Read for new byte on NewSoftSerial.
  serialswread();

};


void serialhwread(){
  i=0;
  if (Serial.available() > 0){            
    while (Serial.available() > 0) {
      inSerial[i]=(Serial.read());
      delay(10);
      i++;      
    }
    
    inSerial[i]='\0';
    if(!strcmp(inSerial,"/END")){
      Serial.println("_");
      inSerial[0]=0x1a;
      inSerial[1]='\0';
      gsm.SimpleWriteln(inSerial);
    }
    //Send a saved AT command using serial port.
    if(!strcmp(inSerial,"TEST")){
      Serial.println("SIGNAL QUALITY");
      gsm.SimpleWriteln("AT+CSQ");
    }
    //Read last message saved.
    if(!strcmp(inSerial,"MSG")){
      Serial.println(msg);
    }
    else{
      Serial.println(inSerial);
      gsm.SimpleWriteln(inSerial);
    }    
    inSerial[0]='\0';
  }
}

void serialswread(){
  gsm.SimpleRead();
}

Praticamente se lascio il codice inalterato, lancia correttamente la pagina di google.com e me la visualizza sul monitor seriale, immaginando che la visualizzazione del contento richiesto avvennisse nel comando presente alla fine del setup

Serial.println("\nNumber of data received:");
Serial.println(numdata);
Serial.println("\nData received:");
Serial.println(msg);

Purtroppo niente di più sbagliato. Infatti se commento il codice all'interno del loop non mi stampa più il contenuto della pagina. Ho fatto varie prove modificando i file della libreria. in particolare ho notato che inserendo un ritardo di alcuni secondi nel metodo httpGET nella nella libreria inetGSM, prima del

int res = gsm.read(result, resultlength);

riesco, poi, a visualizzare parte della pagina ricevuta con il GET.

Il problema è il seguente, io ho bisogno di caricare la pagina web per intero (conservandola in quella variabile MSG) per poter fare una ricerca testuale per altri scopi. Invece ora come ora, o ricevo solo parzialmente la pagina nella variabile MSG oppure devo vederla interamente tramite monitor seriale, ma non me ne faccio nulla, o meglio, non riesco ad intercettare il metodo che fa la lettura carattere per carattere dalla seriale. Se ci riuscissi potrei quanto meno debuggare quello.

Attendo vostri consigli, grazie!

int InetGSM::httpGET(const char* server, int port, const char* path, char* result, int resultlength)
{
  boolean connected=false;
  int n_of_at=0;
  int length_write;
  char end_c[2];
  end_c[0]=0x1a;
  end_c[1]='\0';

  /*
  Status = ATTACHED.
  if(gsm.getStatus()!=GSM::ATTACHED)
    return 0;
  */
  while(n_of_at<3){
	  if(!connectTCP(server, port)){
	  	#ifdef DEBUG_ON
			Serial.println("DB:NOT CONN");
		#endif	
	    	n_of_at++;
	  }
	  else{
		connected=true;
		n_of_at=3;
	}
  }

  if(!connected) return 0;
	
  gsm.SimpleWrite("GET ");
  gsm.SimpleWrite(path);
  gsm.SimpleWrite(" HTTP/1.0\nHost: ");
  gsm.SimpleWrite(server);
  gsm.SimpleWrite("\n");
  gsm.SimpleWrite("User-Agent: Arduino");
  gsm.SimpleWrite("\n\n");
  gsm.SimpleWrite(end_c);

  switch(gsm.WaitResp(10000, 10, "SEND OK")){
	case RX_TMOUT_ERR: 
		return 0;
	break;
	case RX_FINISHED_STR_NOT_RECV: 
		return 0; 
	break;
  }
  
  
 delay(50);
  	#ifdef DEBUG_ON
		Serial.println("DB:SENT");
	#endif	
	
  int res = gsm.read(result, resultlength);

	
// Tolto commento a metodo disconnectTCP
  disconnectTCP();
  
  //int res=1;
  return res;
}

inetGSM.cpp (11.8 KB)

GSM.cpp (19.6 KB)

HWSerial.cpp (6.57 KB)

SIM900.cpp (23.6 KB)