Чтение ответа на АТ команды 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 выходит с нее.. (( читает только первую приходящую? Подскажите..Вопрос снят. Разобрался.
Если не секрет как разобрались? У меня токаяже задачка. Немогу разобратся.