void зацикливается или нет?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015
void nabor() {
  delay(5000);
  gsm.println("atd+хххххххххх..;");      //звоним по номеру 
  delay(100);
  if (gsm.find("OK")) Serial.println("ATD+OK!");
  if (gsm.find("ERROR")) Serial.println("ERROR");
  if (gsm.find("ERROR")) nabor();
 }

а можно ли создавать подобные вараинты, или нужно по другому пути шагать?

оно компилируется, правда в разных вараинтах - все же не работает.

vde69
Offline
Зарегистрирован: 10.01.2016

во первых слово delay - это уже плохо, а тем более в 5 секунд

во вторых я не понял вопроса, при чем здесь "зацикливается" вообще?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

vde69 пишет:
во вторых я не понял вопроса, при чем здесь "зацикливается" вообще?

Рекурсию он сделал. Подход неверный по определению. Надо в конечный автомат переделываь.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

да, я подозреваю, что это не верный вариант, теперь знаю название - рекурсия :)

какая альтернатива этому вараинту, что использовать?

суть чего хотел добится я думаю понятно, код "китайский" - согласен. Подскажите хоть чем и как это должно решаться, я не прошу дать готовый результат.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

если еще один void написать и прыгать в него и там задержку делать - это выход?

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Примерно так:

void nabor() 
{
  switch (st)
  {
  case 0: tmr=millis(); st=1; break;
  case 1: if (millis()-tmr>5000) st=2; break; //delay(5000);
  case 2: gsm.println("atd+хххххххххх..;");      //звоним по номеру 
    tmr=millis(); st=3; break;
  case 3: if (millis()-tmr>100) st=4; break; //delay(100);
  case 4: if (gsm.find("OK")) {Serial.println("ATD+OK!"); st=5;}
    else if (gsm.find("ERROR")) {Serial.println("ERROR"); st=0;}
    break:
  }
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Или так :

void nabor() 
{
byte st = 0;
while (st < 5)
 {
  switch (st)
  {
  case 0: tmr=millis(); st=1; break;
  case 1: if (millis()-tmr>5000) st=2; break; //delay(5000);
  case 2: gsm.println("atd+хххххххххх..;");      //звоним по номеру 
    tmr=millis(); st=3; break;
  case 3: if (millis()-tmr>100) st=4; break; //delay(100);
  case 4: if (gsm.find("OK")) {Serial.println("ATD+OK!"); st=5;}
    else if (gsm.find("ERROR")) {Serial.println("ERROR"); st=0;}
    break;
  }
 }
}

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

..ооо.. ! огромный сенкс, пойду изучать эти варианты.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

"void зацикливается или нет?", "если еще один void написать и прыгать в него и там задержку делать - это выход?"

При чём здесь void? Вы говорите про функцию, а void это всего лишь тип возвращаемого значения этой функции, а конкретно - ничего не возвращает. Называйте вещи своими именами.