Помогите найти задержку в программе
- Войдите на сайт для отправки комментариев
Втр, 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 секунда. только по идее они не должны выполняться, пока условие не выполняется?
Проверьте:
Возможно
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 с программой ?
всем спасибо. разобрался)