Я делаю GET для моего сервера, но мой код не ждет до конца ответа SIM900 о завершении. По I2 C я вижу полный ответ сервера на SIM900, все в порядке, но Arduino неправильно записывает его на последовательный порт.
Мне нужно правильно записать на серийный номер и сохранить его на переменную для его разбора, и продолжил мой код.
Код:
SoftwareSerial SIM900(7, 8); //ASIGANR PINES 7 Y 8 A LA VARIABLE DEL SIM900
char direccion[] = "GET /arduino/getstate.php?color=All HTTP/1.1\r\nHost: XXXXXX\r\nConnection: close\r\n\r\n";
char aux_str[50];
int respuesta;
void setup() { //configuracion
Serial.begin(19200);
SIM900.begin(19200);
delay(1000);
power_on();
checkok();
enviarAT("AT+CSTT=\"movistar.es\",\"MOVISTAR\",\"MOVISTAR\"", "OK", 3000); //Definimos el APN, usuario y clave a utilizar
enviarAT("AT+CIICR", "OK", 3000);
enviarAT("AT+CIFSR", "OK", 3000);
enviarAT("AT+CFUN?", "+CFUN: 1", 3000); // comprueba si esta operativo =1
}
void loop() { // Programa
enviarAT("AT+CGREG?", "+CGREG: 0,1", 3000);
enviarAT("AT+CIPSTART=\"TCP\",\"XXXXXXXXX\",\"80\"", "CONNECT OK", 5000); //Inicia una conexión TCP
// Envíamos datos a través del TCP
sprintf(aux_str, "AT+CIPSEND=%d", strlen(direccion));
if (enviarAT(aux_str, ">", 10000) == 1)
{
enviarAT(direccion, "OK", 10000);
}
enviarAT("AT+CIPSHUT", "SHUT OK", 3000);
}
void(* resetFunc) (void) = 0; //Funcion Reinicio Arduino
void checkok()//comprobar estados
{
int i = 1;
while ( enviarAT("AT+CREG?", "+CREG: 1,1", 1000) == 0 ){
Serial.println((String)"Intento..."+i);
i = i +1;
if (i == 10 ){
Serial.println("Reiniciando...");
delay(1000);
resetFunc(); //Llama a reinicirar Arduino
}
}
}
// enviarAT
int enviarAT(String ATcommand, char* resp_correcta, unsigned int tiempo)
{
int x = 0;
bool correcto = 0;
char respuesta[100];
unsigned long anterior;
memset(respuesta, '\0', 100); // Inicializa el string
delay(100);
while ( SIM900.available() > 0) SIM900.read(); // Limpia el buffer de entrada
SIM900.println(ATcommand); // Envia el comando AT
x = 0;
anterior = millis();
// Espera una respuesta
do {
// si hay datos el buffer de entrada del UART lee y comprueba la respuesta
if (SIM900.available() != 0)
{
respuesta[x] = SIM900.read();
x++;
// Comprueba si la respuesta es correcta
if (strstr(respuesta, resp_correcta) != NULL)
{
correcto = 1;
}
}
}
// Espera hasta tener una respuesta
while ((correcto == 0) && ((millis() - anterior) < tiempo));
Serial.println(respuesta);
return correcto;
}
void power_on() // encender SIM900
{
int respuesta2 = 0;
int i= 1; //contador
// Comprueba que el modulo SIM900 esta arrancado
if (enviarAT("AT", "OK", 2000) == 0)
{
Serial.println("Iniciando SIM...");
pinMode(9, OUTPUT);
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(1000);
// Espera la respuesta del modulo SIM900
while (respuesta2 == 0) {
// Envia un comando AT cada 2 segundos y espera la respuesta
respuesta2 = enviarAT("AT", "OK", 2000);
SIM900.println(respuesta2);
Serial.println((String)"Intento..."+i);
i = i +1;
if (i == 10 ){
Serial.println("Reiniciando...");
delay(2000);
resetFunc(); //Llama a reinicirar Arduino
}
}
}
Serial.println("SIM Conectada");
delay(2000);
}```
Arduino write like this (or nothing):
```AT+CIPSEND=88
>
GET /arduino/getstate.php?color=All HTTP/1.1
Host: XXXXXXXX
Connection: close
SEND OK
`⸮ɒ⸮⸮ՊHh⸮W.'
⸮⸮⸮⸮⸮⸮2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.4.1
X-Powered-By: PHP/7.4.1
Content-Length: 6
Content-Type: text/html; charset=UTF-8
Connection: close```