Помогите найти задержку в программе

kazanova0604
Offline
Зарегистрирован: 25.04.2017

Добрый день. Имеется вот такой вот код.

// реагируем на звонок
#include <SoftwareSerial.h>


SoftwareSerial gsm(2, 3); // RX, TX

const int zapusk = 8;
void setup() {
Serial.begin(9600);
gsm.begin(9600);
pinMode(zapusk, OUTPUT); 
}

void loop() 
{
Serial.println("Nachalo");
 // Serial.println(Serial.available());
if (gsm.available())
Serial.write(gsm.read());
if (Serial.available())
gsm.write(Serial.read());

if(gsm.find("RING")){ // если нашли RING
Serial.println("RING!");
gsm.println("AT+CLIP=1"); // включаем АОН,
delay(10);

while(1){ // в цикле
if (gsm.find("79062106510")){ // ищим номер телефона, если нашли
digitalWrite(zapusk, HIGH); // включаем светодиод
delay(10);
digitalWrite(zapusk, LOW); //отключаем светодиод
delay(10);
Serial.println("!!!");
break; // и выходим
}
else{ // иначе
gsm.println("AT+CPAS"); // спрашиваем состояние модема
delay(10);
if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла
} // если звонок в процессе, возвращает +CPAS: 3
} // и крутимся дальше

gsm.println("AT+CLIP=0"); // выключаем АОН,
delay(10);
gsm.println("ATH0"); // сбрасываем вызов

}
Serial.println("konec");
}

Вопрос в следующем: откуда берется задержка в 1 секунду между 16 и 49 строчкой и как от нее избавиться?

sadman41
Offline
Зарегистрирован: 19.10.2016

А вы после каждого gsm.println навставляйте Serial.println(millis()) и узнаете, куда пропадают секунды...

kazanova0604
Offline
Зарегистрирован: 25.04.2017

вот на эти строки тратится 1 секунда. только по идее они не должны выполняться, пока условие не выполняется?

if(gsm.find("RING")){ // если нашли RING
Serial.println("RING!");

gsm.println("AT+CLIP=1"); // включаем АОН,
delay(10);

while(1){ // в цикле
if (gsm.find("79062106510")){ // ищим номер телефона, если нашли
digitalWrite(zapusk, HIGH); // включаем светодиод
delay(10);
digitalWrite(zapusk, LOW); //отключаем светодиод
delay(10);
Serial.println("!!!");
break; // и выходим
}
else{ // иначе
gsm.println("AT+CPAS"); // спрашиваем состояние модема
delay(10);
if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла
} // если звонок в процессе, возвращает +CPAS: 3
} // и крутимся дальше

gsm.println("AT+CLIP=0"); // выключаем АОН,
delay(10);

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Проверьте:

Serial.println(millis());
byte ringing=gsm.find("RING");
Serial.println(millis());
if (ringing) {
...
}
Serial.println(millis());

 

andrey14
Offline
Зарегистрирован: 19.04.2015

Возможно gsm.find не находит строку и ждет таймаут в 1 сек.

Попробуйте заменить find() на read() и уже в прочитанных данных искать RING.

semaawp
semaawp аватар
Offline
Зарегистрирован: 29.05.2017

После инициализации сериал порта вбейте Serial.setTimeout(100); и проверьте еще раз

wu4k@mail.ru
Offline
Зарегистрирован: 09.09.2017

while(1) - ваша беда, т.к. GSM не сразу возращает результат! а при чем у вас там delay стоит. т..е перед тем как ваш GSM вернет результат ваш код стопорится на delay вот уберите delay и время сильно сократится.

 

Ваша система должна строится так:

if (gsm.avarable () > 0)

 char c = read;

if (c != '\0') or c!='n'

String _Text +=c

else

// Тут вы передаете в другую процедуру слова которые получили от вашего GSM, а ниже обнуляете..

// это правильно потомучто работало успешно у меня и продолжает работать по такому принцепу.

_Text = "";

 

____________________________

также есть такая хитрая библия SmartDelay.h ее надо использовать по уму если. а иначе вы ничего путного не напишите и в итоге ваша копеишная программа в 5 стр будет висеть на каждом светодиоде. А если в ней 10000 срок и 10 светодиодов + gsm + lan + rfid + вычисления, шифрование общение по HTTP с программой ?

kazanova0604
Offline
Зарегистрирован: 25.04.2017

всем спасибо. разобрался)