[SOLUCIONADO] Problema de comunicación Arduino -> Shield 3G ElecFreaks

Buenas a todos, estoy comunicando mi Arduino con un Shield 3G basado en el SIM5216.

Configuro ambas velocidades a 115200 (que es la default del shield), y puedo utilizar los comandos AT.

El problema es que yo necesito leer las respuestas del módulo, por ejemplo, la IP.

Utilizando un código sencillo para enviar y recibir datos en el Serial del Arduino, varias veces recibo basura por lo que no me llegan correctamente los datos. Alguna idea?
Dejo el código y unos screens

#include <SoftwareSerial.h>

SoftwareSerial Shield(2,3);
char rta[100];
boolean timeout;
int x = 0, paso = 0;
unsigned long tiempo;

void setup() {
  Serial.begin(115200);
  Shield.begin(115200);

  timeout = false;
}

void loop() {
  while(Serial.available()) Shield.write(Serial.read());
  //while(Shield.available()) Serial.write(Shield.read());

  if(Shield.available()){
    getResponse();
  }

  if(strstr(rta, "+CREG:0,5") != NULL || strstr(rta, "+CREG:0,1") != NULL){
    Serial.print("DEBUG BUFFER: ");
    Serial.println(rta);
    //delay(5000);
    memset(rta, 0, 100); //Clean Buffer
    Serial.print("DEBUG CLEANED BUFFER: ");
    Serial.println(rta);
    Serial.println("Registrado en la red");
    paso = 1;
  }

  if(paso == 1){    
    Shield.println("AT+CSOCKAUTH=1,1,\"gprs\",\"gprs\"");
    //getResponse();

    if(strstr(rta, "OK") != NULL){
      Serial.print("DEBUG BUFFER: ");
      Serial.println(rta);
      //delay(5000);
      memset(rta, 0, 100); //Clean Buffer
      Serial.print("DEBUG CLEANED BUFFER: ");
      Serial.println(rta);
      Serial.println("Datos de acceso configurados");
      paso = 2;
    }
  }

  if(paso == 2){
    Shield.println("AT+CGSOCKCONT=1,\"IP\",\"gprs.personal.com\"");
    //getResponse();

    if(strstr(rta, "OK") != NULL){
      Serial.print("DEBUG BUFFER: ");
      Serial.println(rta);
      //delay(5000);
      memset(rta, 0, 100); //Clean Buffer
      Serial.print("DEBUG CLEANED BUFFER: ");
      Serial.println(rta);
      Serial.println("VPN configurado");
      paso = 3;
    }
  }

  if(paso == 3){
    ///Shield.println("AT+NETOPEN=\"TCP\",4444");

    //Serial.println("Opening port...");
    
    if(timeout == false){
      tiempo = millis();
      Serial.println("Opening port...");
      Shield.println("AT+NETOPEN=\"TCP\",4444");
      timeout = true;
    }

    if(strstr(rta, "OK") != NULL){
      Serial.print("DEBUG BUFFER: ");
      Serial.println(rta);
      //delay(5000);
      memset(rta, 0, 100); //Clean Buffer
      Serial.print("DEBUG CLEANED BUFFER: ");
      Serial.println(rta);
      Serial.println("Puerto Abierto");
      timeout = true;
      paso = 4;
    }

    if((millis() - tiempo) < 10000){
      timeout = true;
    }else{
      Serial.println("TIMEOUT!");
      Serial.println("Trying again...");
      timeout = false;
    }
  }
}

void getResponse(){
  memset(rta, 0, 100);
  x = 0;

  while(Shield.available()){

    rta[x] = Shield.read();

    x++;
  }

}

Ese código lo elaboré un poco, pero incluso usando solo las primeras dos líneas:

while(Serial.available()) Shield.write(Serial.read());
while(Shield.available()) Serial.write(Shield.read());

y enviando los comandos AT manualmente, recibo basura entre las palabras..

Acá adjunto fotos del primer código "elaborado" en funcionamiento:

Personalmente no me gusta poner SoftwareSerial.h 115.2 kbps. porque no bajas a 9600 tanto la definición como el modulo SIM.
Intenta si dejas de recibir basura de ese simple modo.

EDITO: SHield.begin(9600)
el Serial manejalo como gustes. ese no hay problema pero el otro no tiene sentido. Leerás todo igual a 9600 y si ves que funciona bien a 19200 o mas lo vas viendo.

Ya lo he intentado, pero el shield trabaja por defalt a 115.2kbps, y al establecer una velocidad menor a través del comando AT+IPR o AT+IPREX a 9600, el shield deja de comunicarse y no logro respuestas de ningún comando AT.

Epa.. eso no lo consideré..
SE debe a la necesidad de transmitir datos ?

Otra consulta. Obviamente estas con un UNO?
No puedes usar un MEGA o DUE que tienen 4 puertos. Yo lo consideraría.

Puedes poner un link del shield por favor.

Es correcto, estoy utilizando un Arduino UNO.

Este es el link del shield, en la pestaña "Resources" se encuentra toda la información de Hardware y Software.

http://www.elecfreaks.com/estore/3g-shield.html

Y también me basé en la configuración del SIM en el Manual del SIM5216e con los comandos AT:

http://ec-mobile.ru/user_files/File/SIMCom/simcom_sim5215sim5216_atc_en_v1.05.pdf

¿Puede ser que se deba a algo relacionado con el bit de parada del UART al escribir hacia el Arduino a través del BUS Serial?

Bueno, parece que acabo de resolver mi problema..

Utilicé el comando AT+IPREX=19200 que establece la velocidad del Shield a 19200 permanentemente, por lo que si reinicio el Shield, no pierdo la configuración.. Luego de eso, fuí al programa del arduino y modifiqué el "Shield.begin(115200)" por "Shield.begin(19200)"; y lo mismo con el Serial.
La conexión es un poco más lenta pero no necesito velocidad, si no buena lectura de datos, cosa que logré cambiando así la configuración.. Ahora la velocidad funciona perfectamente con el Arduino y las respuestas vienen sin basura alguna.

Ahora seguiré con el código a ver si me topo con otro problema, lo cual comentaré en este hilo en caso de seguir abierto.

Muchas gracias por el interés a todos

Perfecto!

Si ya está solucionado, por favor, edita el título de tu primer mensaje agregándole [SOLUCIONADO] así podemos cerrar el hilo para que no sea vuelto a abrir dentro de un par de siglos. :slight_smile: