Программирование

Тема в разделе "Arduino & Shields", создана пользователем Михаил_робототехник, 9 ноя 2015.

  1. Можно ли прервать функцию "loop()", чтобы сделать не бесконечную программу?
    Пожалуйста, люди, помогите мне - чайнику.
     
  2. Mestniy

    Mestniy Гуру

    А что за функция?
     
  3. Та функция, что объявляется в начале
    void loop()
    {
    А здесь основное тело программы, и все команды, которые здесь пишутся будут повторяться бесконечное кол- во раз. Соответственно программа - бесконечна. А мне нужно сделать так, чтобы она имела конец.

    }
     
  4. Mestniy

    Mestniy Гуру

    В void setup() Впишите. Она происходит всего один раз за программу.
     
  5. Mestniy

    Mestniy Гуру

    Да это ясно. Я хотел узнать зачем Вам это или В каком коде это может пригодиться??
     
    Последнее редактирование: 9 ноя 2015
  6. DrProg

    DrProg Вечный нерд

    Странный вопрос. Логика работы МК как правило основана на том, что он по большому счету делает одно и то же по кругу. Ждет чего-то, чтобы сделать что-то, например. А если нужно сделать один раз и остановиться, то, как сказал предыдущий оратор, написать код в setup а loop оставить пустым. Или написать код в loop, а в конце закрутить его в бесконечном пустом цикле while(true);
     
    ИгорьК и Airbus нравится это.
  7. Mestniy

    Mestniy Гуру

    Это же робототехник, он знает про это:D:D:D:D.
    Да кто из нас по правде говоря не заморачивался не разу такими темами. Они нужны для пополнения знаний и желания похимичить!
     
  8. Airbus

    Airbus Радиохулиган Модератор

    Можно. Используйте оператор Dо While У меня в скетче и сделано так чтоб программа выполнилась один раз
    void loop()
    {
    do {
    //Скетч
    }
    while (0);
    }
    Либо либо for (int i=0; i <1; i++) выполниться один раз а так
    for (int i=0; i <2; i++) два раза
     
    Последнее редактирование: 9 ноя 2015
  9. geher

    geher Гуру

    С точки зрения потребления энергии правильнее будет вырубить всю периферию и усыпить.
     
    AlexU нравится это.
  10. Airbus

    Airbus Радиохулиган Модератор

    Да зачем же вырубать?Бывает надо чтоб скетч выполнился один раз вот например я в соседней теме выложил устройство для восстановления фьюзов.При включении питания скетч срабатывает фьюзы восстанавливаются до заводских и программа банит сама себя.Незачем по кругу гонять незачем кнопки которые дают дребезг.Или для чего то еще да мало ли для чего?
     
  11. AlexU

    AlexU Гуру

    При таком подходе код внутри циклов будет выполняться при каждом новом вызове функции loop(), т.е. многократно.
    Прервать функцию можно, только учтите, что код главной функции main() выглядит примерно так (убрал лишнее):
    Код (C++):
    int main(void)
    {
        init();

        initVariant();

        setup();  // вызов функции из скетча
       
        for (;;) { // бесконечный цикл
            loop();  // вызов функции из скетча
        }
           
        return 0;
    }
    поэтому сколько не прерывай -- функция loop() будет вызываться пока не "выключить контроллер". Поэтому грамотный совет дал geher:
     
  12. Airbus

    Airbus Радиохулиган Модератор

    Вы внимательно читали?
    Код (C++):
    void loop()
    {
    do {
    //Скетч
    }
    while (0);
    }
    do - делаем - while (0);-стоп. Скетч проверен и давно успешно работает.
    Либо
    for (int i=0; i <1; i++)
    Либо правда заткнуть в void setup()
    Либо есть извраты но зачем нам усложнять код?Это же 4 класс средней школы? http://tinyurl.com/og4nrtu
    А вот то что Вы нагородили я так и не понял там как раз будет бесконечный цикл да ещё зачем return 0?
     
    Последнее редактирование: 10 ноя 2015
  13. DrProg

    DrProg Вечный нерд

    Вечный цикл:
    Код (C++):
    while(1);
    всё. 5 класс, вероятно.
     
    ИгорьК нравится это.
  14. AlexU

    AlexU Гуру

    Это не я нагородил, а разработчики Arduino -- все вопросы к ним. Полный код функции 'main()' можно посмотреть в файле main.cpp в подкаталоге 'hardware/arduino/avr/cores/arduino/' относительно каталога, в который установлена среда Arduino IDE. Эта функция 'main()' является точкой входа в скетч и именно из нее вызываются привычные Вам функции 'setup()' и 'loop()' -- функция 'setup()' вызывается один раз, а функция 'loop()' в бесконечном цикле (все это видно при внимательном рассмотрении кода функции 'main()').
    Что касается do ... while(0); -- тело цикла выполнится один раз, но функция 'loop()' вызывается в цикле и при каждом вызове функции будет один раз выполняться тело цикла.
    Звезды сошлись для Вас удачно -- не понимая сути, Вы смогли получить код, работающий так как Вам нужно, хотя не так как Вы хотите (скорее всего Ваш код запускается циклично, только Вы этого не замечаете).
     
  15. DrProg

    DrProg Вечный нерд

    Когда уже научимся код вставлять в специальное окно? Вы же видите, что другие так делают, почему бы не попробовать?
     
    ИгорьК нравится это.
  16. Alex19

    Alex19 Гуру

    Код (C++):
    if (serialEventRun) serialEventRun();
    В библиотеке Serial (HardwareSerial), есть события SerialEvent, SerialEvent1 и т.д. (в зависимости от плат и не во всех поддерживается). О самих событиях, прочесть можно тут - https://www.arduino.cc/en/Reference/SerialEvent.

    Сам метод в классе HardwareSerial.cpp.
    Код (C++):
    void serialEventRun(void)
    {
    #if defined(HAVE_HWSERIAL0)
      if (Serial0_available && serialEvent && Serial0_available()) serialEvent();
    #endif
    #if defined(HAVE_HWSERIAL1)
      if (Serial1_available && serialEvent1 && Serial1_available()) serialEvent1();
    #endif
    #if defined(HAVE_HWSERIAL2)
      if (Serial2_available && serialEvent2 && Serial2_available()) serialEvent2();
    #endif
    #if defined(HAVE_HWSERIAL3)
      if (Serial3_available && serialEvent3 && Serial3_available()) serialEvent3();
    #endif
    }
    Если ее убрать, то Вы не сможете пользоваться лишь SerialEvent. Само по себе данное событие немного сомнительное, проверяется лишь в конце loop. И если у Вас есть задержка в цикле, к примеру while, а данные идут, есть вероятность пропустить данные.

    Что касается вариантов, мне нравится вариант geher, а вариантов не мало. Но если энергопотребление не требуется, можно сделать и на циклах и без них. В зависимости от требований, предпочтений
     
  17. AlexU

    AlexU Гуру

    Куда последний пост дели? Или все-таки разобрались в чем Ваша ошибка?
     
  18. Airbus

    Airbus Радиохулиган Модератор

    Код (C++):

    /*
      Blink
      Turns on an LED on for one second, then off for one second, repeatedly.
      This example code is in the public domain.
    */


    // Pin 13 has an LED connected on most Arduino boards.
    // give it a name:
    int led = 13;
    // the setup routine runs once when you press reset:
    void setup() {
      // initialize the digital pin as an output.
      pinMode(led, OUTPUT);
      {
      digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);               // wait for a second
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);               // wait for a second
      }
    }
    // the loop routine runs over and over again forever:
    void loop()
    {}
     
    Да был неправ извините-проверял на практике.Единственный способ-засунуть в Setup что и сделал.Мигает один раз.Так получается что циклы работающие в чистом Си на Ардуине не работают?
     
    Последнее редактирование: 10 ноя 2015
  19. Alex19

    Alex19 Гуру

    Разумеется они работают, как все это происходит, с начало запускается main
    Код (C++):
    int main(void)
    {
        init();

        initVariant();

    #if defined(USBCON)
        USBDevice.attach();
    #endif

        setup();

        for (;;) {
            loop();
            if (serialEventRun) serialEventRun();
        }
       
        return 0;
    }
    Он 1 раз вызывает setup(), затем бесконечный цикл for в котором вызывается loop(). Вы в loop() прописываете свой цикл while он делает 1 цикл, выходит из него, loop завершается идет проверка
    Код (C++):
    if (serialEventRun) serialEventRun();
    и мы снова идем на loop. Все из-за того, что мы в бесконечном цикле.
    Код (C++):
    for (;;)
    {
       loop();
       if (serialEventRun) serialEventRun();
    }
    Если бы его не было, все сработало, так как Вы ожидали.
     
    Airbus нравится это.
  20. Airbus

    Airbus Радиохулиган Модератор

    Да это то я понял но получается что Ардуину не "остановить" так как это можно сделать на Асме или Си?Она всегда будет "гонять" по кругу void loop?Или (уже попробовал-работает) как сказал
    наглухо зациклить?Так?