Задвоение данных в мониторе порта

Тема в разделе "Arduino & Shields", создана пользователем gedat, 19 янв 2020.

  1. gedat

    gedat Нуб

    Всем привет. Только начал осваивать arduino idle , и сразу появилась проблема.
    Почему-то монитор порта задваивает значения. Пишешь один раз , а выполняет два.
    Вот к примеру код
    Код (C++):
    byte val;

    void setup() {
       Serial.begin(9600);
    }

    void loop() {
      if (Serial.available() ) {
        val = Serial.parseInt();
        if (val == 1 || val == 5) {
          Serial.println("1 либо 5");
        } else {
          Serial.println("Мимо");
        }
      }
    }
     
    Когда вводишь 1 , консоль пишет
    Получается один запрос выполняется 2 раза
    и выходит
    Тоже самое получается с другим кодом. Вводишь 1 число , а ответ дает 2 раза.
    В этом пока мало разбираюсь , в чем проблема?
     
  2. parovoZZ

    parovoZZ Гуру

    Я так подозреваю, что консоль следом шлет символ переноса/конца строки, на которую и реагирует Serial.available()
     
    Mestniy, NikitOS и DIYMan нравится это.
  3. SergeiL

    SergeiL Оракул Модератор

    Да, там похоже идут 0x0D, 0x0A.
    На этапе отладки, обучения, старайтесь выводить в монитор порта максимум информации.
    Что получено, куда зашли, что послали.
    Это помогает проанализировать всю информацию. Потом пытаемся понять, как работает код, и где ошибки.
     
  4. Daniil

    Daniil Гуру

    Я бы после отработки цикла занулял был val.
     
  5. gedat

    gedat Нуб

    Как этого избежать ? Делаю всё по ролику , там всё работает :(
    Подскажите пожалуйста , где эта функция включается.
     
  6. Daniil

    Daniil Гуру

    В мониторе порта или его настройках должна быть галочка (или выпадающий список) что-то вроде "отправить сивол завершения строки" (EoL (end of Line) или "\n"). Нужно выбрать так, чтобы терминальная программа ничего не отсылала.
    нигде, это надо самому так писать, чтобы знать где ваш код застрял и как отработал операцию. Грубо говоря, везде пихать serial.print(отладочная информация), причем, нужно понимать, что вывод занимает время. Если код чувствителен ко времени, то могут появиться проблемы и из-за этого. Опыт придет со временем.
    Я рекомендую поставить HTerm - в нем можно смотреть по байтам что вы отсылаете/принимаете сразу в hex и ascii (или др. варианты).
     
    Последнее редактирование: 19 янв 2020
    DetSimen, arkadyf и SergeiL нравится это.
  7. DetSimen

    DetSimen Guest

    Разбирайся
    Код (C++):
    /*
        Name:       Blink.ino
        Created:    20.01.2020 8:28:04
        Author:     DtS
    */



    void setup()
    {
        Serial.begin(115200);
        delay(250);
        Serial.println("Program started.");


    }

    void loop()
    {
        if (!Serial.available()) return;

        if (Serial.peek() < 0x20) {
            while (Serial.available()) Serial.read();
            return;
        }

        int32_t val = Serial.parseInt();
        Serial.print("val = "); Serial.println(val);

    }
     
     
    Daniil и Mestniy нравится это.