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: