Чтение ответа на АТ команды GPRS шилда.

Life23
Offline
Зарегистрирован: 10.08.2013

Задача состоит в том, что бы передать АТ команды шилду. Прочитать ответ и отреагировать.

Когда ожидаемый ответ ОК - все нормально, с кодом проблем нет. Если нет ответа выходим по timout. А вот когда отсылаю команду где бывают разные ответы, типа "ОК" "CONNECT OK" или "FAILED" - не могу понять как правильно написать код.

Как именно отправлять правильно строку:

("AT+CIPSTART=\"TCP\",\"192.168.0.1",\"8080\"");")  (именно с ней и не могу разобраться..)

 При чем, опытным путем проверил, что первая строка ответа почти всегда идет "ОК" а вторая или "CONNECT OK" или "FAILED".

Ниже привожу код. 

#define INPUT_BUF_SIZE 70 // размер входного буфера
char input_buff[INPUT_BUF_SIZE+1]; // место под хранение входящих из GPRS данных
byte inputBuffIndex=0;
#define OK_TIMEOUT 13000  // сколько времени ждать OK в ответ ни команду
unsigned long interval = 35000UL; //интервал Времени 

void loop(){
  Serial.println("Start loop! Wait 5 second... ");
  delay(5000);
  TrySendDataToServer();
}

void TrySendDataToServer(){
  unsigned long currentMillis;
  static unsigned long previousMillis = 0;
  currentMillis = millis();
  if (currentMillis - previousMillis > interval)
  {
    SendDataToServer();
    previousMillis = currentMillis;
  }
}

void SendDataToServer(){
  if (InitConnect()){

    GPRS.println("AT+CIPSTART=\"TCP\",\"192.168.0.1",\"8080\"");");
    delay(3000);
    GPRS.println(DeviceMac);
    GPRS.print(Sensor1_t_MAC);
    SensorRead(sensor1);
    GPRS.println(Sensor_t_Statment);
    GPRS.println("##");
    gprsCmdAndWaitln("\x1A");
    delay(2000);
    GPRS.println("AT+CIPSHUT");
  }
}
bool InitConnect(){
  return gprsCmdAndWaitOK("AT+CGATT=1") //Attaching to network... ответ OK
      && gprsCmdAndWaitOK("AT+CSTT=\"internet\"")  // ("AT+CPBS=\"SM\"") //подключаемся к APN ответ OK 
        && gprsCmdAndWaitOK("AT+CIICR"); 
}


bool gprsCmdAndWaitOK(char* commandText ){ //отправка в serial с переводом строки
  char tmpBuff[INPUT_BUF_SIZE+1]; // временно сохраняем текущие входной буфер  
  memcmp(tmpBuff,input_buff,INPUT_BUF_SIZE+1);
  byte tmpBuffIndex=inputBuffIndex;
  GPRS.println(commandText);
  delay(500);
  bool ok=false; // дождались ok или нет
  bool timeout=false; // флаг означающий что вышло время
  unsigned long startWait=millis();
  while(!ok){
    while(!isLineReady()){ // ждем готовую строку, но не дольше OK_TIMEOUT времени
      if( (millis()-startWait)>OK_TIMEOUT){ // не слишком ли долго ждем?
        timeout=true;
        Serial.println("timeout");
        break;
      }
    }
    if(timeout){
      break;
    } 
    if(strcmp("OK",input_buff)==0){
      ok=true;
      Serial.println("ok received");
      break;
    }
  }
  memcmp(input_buff,tmpBuff,INPUT_BUF_SIZE+1);
  inputBuffIndex=tmpBuffIndex;
  return ok && !timeout;
}

bool isLineReady(){
  if (GPRS.available()){
    byte t = GPRS.read();
    switch(t){
    case '\n':
      input_buff[inputBuffIndex] = 0; 
      inputBuffIndex=0;
      return true; 
      break;
    case '\r':
      break;
    default:
      if (inputBuffIndex < INPUT_BUF_SIZE){
        input_buff[inputBuffIndex] = t; 
        inputBuffIndex++;
      }  
    }
  }
  return false;
}

 

Life23
Offline
Зарегистрирован: 10.08.2013

создаю еще одну функцию как   gprsCmdAndWaitOK только   if(strcmp("CONNECT OK",input_buff)==0){    все равно глюки.. по timeot выходит с нее.. (( читает только первую приходящую? Подскажите..

Life23
Offline
Зарегистрирован: 10.08.2013

Вопрос снят. Разобрался.

TiPash235
Offline
Зарегистрирован: 12.03.2013

Если не секрет как разобрались? У меня токаяже задачка. Немогу разобратся.