C++ Arduino等待sim900结束响应

C++ Arduino等待sim900结束响应,c++,c,arduino,C++,C,Arduino,我正在访问我的服务器,但我的代码不会等到SIM900 end响应结束。 通过I2C,我可以看到服务器对SIM900的完整响应,这是正常的,但Arduino没有将其正确写入串行 我需要正确地编写序列号,并将其保存在一个变量中进行解析,然后继续我的代码 代码: 软件串行SIM900(7,8)//阿西甘松树7年8月A日可变DEL SIM900 char direccion[]=“GET/arduino/getstate.php?color=All HTTP/1.1\r\n主机:XXXXXX\r\n连

我正在访问我的服务器,但我的代码不会等到SIM900 end响应结束。 通过I2C,我可以看到服务器对SIM900的完整响应,这是正常的,但Arduino没有将其正确写入串行

我需要正确地编写序列号,并将其保存在一个变量中进行解析,然后继续我的代码

代码:


软件串行SIM900(7,8)//阿西甘松树7年8月A日可变DEL SIM900
char direccion[]=“GET/arduino/getstate.php?color=All HTTP/1.1\r\n主机:XXXXXX\r\n连接:关闭\r\n\r\n”;
char aux_str[50];
int respuesta;
void setup(){//configuracion
连载《开始》(19200);
SIM900.贝京(19200);
延迟(1000);
开机();
检查OK();
enviarAT(“AT+CSTT=\“movistar.es\”、\“movistar\”、“movistar\”、“OK”,3000);//定义为APN,通常为实用程序
enviarAT(“AT+CIICR”,“OK”,3000);
enviarAT(“AT+CIFSR”,“OK”,3000);
enviarAT(“AT+CFUN?”,“+CFUN:1”,3000);//压缩机在运行中=1
}
void loop(){//programma
enviarAT(“AT+CGREG?”,“+CGREG:0,1”,3000);
enviarAT(“AT+CIPSTART=\“TCP\”、\“XXXXXXXXX\”、“80\”、“连接正常”,5000);//Inicia una conexión TCP
//恩维阿莫斯·达托斯·特拉维斯·德尔·TCP酒店
sprintf(aux_str,“AT+CIPSEND=%d”,strlen(direccion));
如果(环境(辅助轨道,“>”,10000)=1)
{
enviarAT(指令“OK”,10000);
}
环境(“AT+CIPSHUT”,“关闭正常”,3000);
}
无效(*resetFunc)(无效)=0//雷尼西奥·阿杜伊诺函数
void checkok()//压缩机
{
int i=1;
而(环境(“在+CREG?”,“+CREG:1,1”,1000)=0){
Serial.println((字符串)“Intento…”+i);
i=i+1;
如果(i==10){
Serial.println(“Reiniciando…”);
延迟(1000);
resetFunc();//Llama a reinicrar Arduino
}
}  
}
//环境
int enviarAT(字符串ATcommand,字符*resp_correcta,无符号int tiempo)
{
int x=0;
布尔校正=0;
char respuesta[100];
无信号长前束;
memset(respuesta,'\0',100);//Inicializa el string
延迟(100);
而(SIM900.available()>0)SIM900.read();//Limpia el buffer de entrada
SIM900.println(ATcommand);//Envia el-comando AT
x=0;
前=毫秒();
//埃斯佩拉·乌纳·雷斯佩斯塔
做{
//这是一个缓冲区,可以容纳所有人
如果(SIM900.available()!=0)
{
respuesta[x]=SIM900.read();
x++;
//纠正错误后的应对措施
if(strstr(respuesta,resp_correcta)!=NULL)
{
校正=1;
}
}
}
//这是一个很好的回答
而((correcto==0)和((millis()-前)
GET/arduino/getstate.php?color=All HTTP/1.1
主持人:XXXXXXXX
连接:关闭
发送OK
`⸮ɒ⸮⸮ՊHh⸮W.'
⸮⸮⸮⸮⸮⸮2.4.41(Win64)OpenSSL/1.1.1c PHP/7.4.1
X-Powered-By:PHP/7.4.1
内容长度:6
内容类型:text/html;字符集=UTF-8
连接:关闭```

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