Чтение ответа на АТ команды GPRS шилда.
- Войдите на сайт для отправки комментариев
Втр, 24/12/2013 - 03:54
Задача состоит в том, что бы передать АТ команды шилду. Прочитать ответ и отреагировать.
Когда ожидаемый ответ ОК - все нормально, с кодом проблем нет. Если нет ответа выходим по 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; }
создаю еще одну функцию как gprsCmdAndWaitOK только
if
(strcmp(
"CONNECT OK"
,input_buff)==0){
все равно глюки.. по timeot выходит с нее.. (( читает только первую приходящую? Подскажите..Вопрос снят. Разобрался.
Если не секрет как разобрались? У меня токаяже задачка. Немогу разобратся.