SIM900 grps leer web

Hola,

Tengo un problema con un código muy simple. En él intento leer el contenido de una web usando un módulo SIM900. La web contendrá una cadena corta y sin formato, que abajo indico.

#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8); // configure software serial port

void setup() {     
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
  
  SIM900.begin(19200);
  Serial.begin(19200); 
  Serial.println("power up" );
  delay(15000); 
}

void loop()
{
  Serial.println("SubmitHttpRequest - started" );
  SubmitHttpRequest();
  //callSomeone();
  Serial.println("SubmitHttpRequest - finished" );
  delay(10000);

}

void SubmitHttpRequest()
{
  SIM900.println("AT+CSQ"); // Signal quality check
  delay(100);
  ShowSerialData();
 
  SIM900.println("AT+CSQ"); // Signal quality check
  delay(100);
  ShowSerialData();
  
  SIM900.println("AT+CGATT?"); //Attach or Detach from GPRS Support
  delay(100);
  ShowSerialData();
  
  SIM900.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  delay(1000);
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=3,1,\"APN\",\"gprs-service.com\"");
  delay(1000);
  ShowSerialData();
 
  SIM900.println("AT+SAPBR=1,1");
  delay(1000);
  ShowSerialData();
  
  SIM900.println("AT+HTTPINIT"); //init the HTTP request
  delay(1000); 
  ShowSerialData();
  
  SIM900.print("AT+HTTPPARA=\"URL\",\"http://xxxxxx.com/master.php");
  SIM900.println("\"");
  delay(1000);
  ShowSerialData();
  
  SIM900.println("AT+HTTPACTION=0");//submit the request 
  delay(10000);
  ShowSerialData();
  
  SIM900.println("AT+HTTPREAD");// read the data from the website you access
  delay(500);
  ShowSerialData();
  
  SIM900.println("");
  delay(100);

  SIM900.println("AT+HTTPTERM");// read the data from the website you access
  delay(300);
  ShowSerialData();
}

void getContent()
{
  String content = "";
  while(SIM900.available() != 0)
  {
    content = content + String(char(SIM900.read()));
    Serial.write(char(SIM900.read()));
    delay(500);
    Serial.flush();
  }
}
 
void ShowSerialData()
{
  while(SIM900.available()!=0)
    Serial.write(char (SIM900.read()));
}

Recibo caracteres, pero son menos de los que debería y se cortan en el mismo lugar todas las veces, la salida completa es esta:

power up
SubmitHttpRequest - started
AT+CSQ

+CSQ: 25,0

OK
AT+CSQ

+CSQ: 25,0

OK
AT+CGATT?

+CGATT: 1

OK
AT+SAPBR=3,1,"CONTYPE","GPRS"

OK
AT+SAPBR=3,1,"APN","gprs-service.com"

OK
AT+SAPBR=1,1

OK
AT+HTTPINIT

OK
AT+HTTPPARA="URL","http://xxxxxx.com/master.php"

OK
AT+HTTPACTION=0

OK

+HTTPACTION:0,200,66
AT+HTTPREAD

+HTTPREAD:66
Numero de accesos: 77 | Identifica
AT+HTTPTERM

OK
SubmitHttpRequest - finished

Como veis, la salida es: Numero de accesos: 77 | Identifica (siempre es igual)

Pero realmente la salida debería ser en este caso:
Numero de accesos: 77 | Identificador: 4l02pnl828o3kctg4strc87ed1

¿Alguna idea? No sé cuantas vueltas le habré dado ya al tema.

Gracias!

porque le ponesun delay(500) entre cada caracter? Eso es una barbaridad.
Prueba sin delay y si funciona mal un máximo de delay(50)

void getContent()
{
  String content = "";
  while(SIM900.available() != 0)
  {
    content = content + String(char(SIM900.read()));
    Serial.write(char(SIM900.read()));
    delay(5); // máximo 50 mseg
  }
  //Serial.flush(); // no entiendo para que lo usas si estas leyendo con SIM900.read()
}

surbyte:
porque le ponesun delay(500) entre cada caracter? Eso es una barbaridad.
Prueba sin delay y si funciona mal un máximo de delay(50)

void getContent()

{
  String content = "";
  while(SIM900.available() != 0)
  {
    content = content + String(char(SIM900.read()));
    Serial.write(char(SIM900.read()));
    delay(5); // máximo 50 mseg
  }
  //Serial.flush(); // no entiendo para que lo usas si estas leyendo con SIM900.read()
}

Tienes razón, pero date cuenta que realmente esa función no se usa, se usa siempre ShowSerialData(), la otra la hice por probar y obtuve lo mismo. La debería haber eliminado al publicarlo para evitar lios.

Prueba esto SoftwareSerial puede manejar 64 bytes y yo creo que los superas
En el loop escribe

if (SIM900.overflow()) {
   Serial.println("SoftwareSerial overflow!");

si eso se comprueba agrega al comienzo esto

#define _SS_MAX_RX_BUFF 256 // RX buffer size //BEFORE WAS 64

eso cambia de 64 a 256 bytes tu buffer de entrada

surbyte:
Prueba esto SoftwareSerial puede manejar 64 bytes y yo creo que los superas
En el loop escribe

if (SIM900.overflow()) {

Serial.println("SoftwareSerial overflow!");



si eso se comprueba agrega al comienzo esto



#define _SS_MAX_RX_BUFF 256 // RX buffer size //BEFORE WAS 64



eso cambia de 64 a 256 bytes tu buffer de entrada

Gracias surbyte! Luego pruebo y os cuento, no se me había ocurrido pensar en cuanto puede manejar SoftwareSerial.

Os cuento las novedades. Efectivamente, tal y como decía surbyte, me daba un aviso de overflow tras añadir:

if (SIM900.overflow()) 
   Serial.println("SoftwareSerial overflow!");

Sin embargo, no me deja aumentar el buffer de SoftwareSerial a no ser que lo modifique directamente en el fichero "SoftwareSerial.h". Seguiré buscando la forma de poder modificarlo directamente en el código de mi programa.

Aun así, si cambio el tamaño del buffer en "SoftwareSerial.h" funciona perfectamente y me devuelve la cadena al completo :smiley:

Ahora me queda crear un conjunto de funciones o librería que sea estable y me ayude con el resto de la aplicación, pues ahora mismo es muy poco fiable y cada 2x3 el código que he puesto arriba da errores que aun no he tratado.

Por cierto, ya aprovecho, ¿alguien sabe como activar el gprs sin tener que pulsar el botoncito de la placa?

Un saludo a todos, y gracias de nuevo a surbyte

No tengo la placa asi que esta respuesta es por investigarla en Google.

Connect Sim900 PWRKEY pin with a diode to the VBAT pin.

This way:
PWRKEY -----|>|------ VBAT

Also place a 470uF cap between the PWRKEY and GND.

This will work!

Diodo entre VBat y powerkey ademas de un capacitor de 470uF

Otra sugerencia dice poner un capacitor de 10uF entre PWRKEY y GND.

otra sugerencia es esta

Gracias surbyte, la verdad es que mi módulo se acopla directamente sobre arduino. Normalmente suele encenderse usando el D9, y en otras plaquitas el D7.

En la mía sólo hace el amago con el D6, pero no enciende.

Seguiré investigando, si no lo consigo tendré que usar tu esquemático.