Помогите найти задержку в программе
- Войдите на сайт для отправки комментариев
Втр, 19/09/2017 - 17:17
Добрый день. Имеется вот такой вот код.
// реагируем на звонок
#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 строчкой и как от нее избавиться?
А вы после каждого gsm.println навставляйте Serial.println(millis()) и узнаете, куда пропадают секунды...
вот на эти строки тратится 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);Проверьте:
Serial.println(millis()); byte ringing=gsm.find("RING"); Serial.println(millis()); if (ringing) { ... } Serial.println(millis());Возможно
gsm.findне находит строку и ждет таймаут в 1 сек.Попробуйте заменить find() на read() и уже в прочитанных данных искать RING.
После инициализации сериал порта вбейте Serial.setTimeout(100); и проверьте еще раз
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 с программой ?
всем спасибо. разобрался)