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
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)