Всем привет. Только начал осваивать 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 раза. В этом пока мало разбираюсь , в чем проблема?
Я так подозреваю, что консоль следом шлет символ переноса/конца строки, на которую и реагирует Serial.available()
Да, там похоже идут 0x0D, 0x0A. На этапе отладки, обучения, старайтесь выводить в монитор порта максимум информации. Что получено, куда зашли, что послали. Это помогает проанализировать всю информацию. Потом пытаемся понять, как работает код, и где ошибки.
Как этого избежать ? Делаю всё по ролику , там всё работает Подскажите пожалуйста , где эта функция включается.
В мониторе порта или его настройках должна быть галочка (или выпадающий список) что-то вроде "отправить сивол завершения строки" (EoL (end of Line) или "\n"). Нужно выбрать так, чтобы терминальная программа ничего не отсылала. нигде, это надо самому так писать, чтобы знать где ваш код застрял и как отработал операцию. Грубо говоря, везде пихать serial.print(отладочная информация), причем, нужно понимать, что вывод занимает время. Если код чувствителен ко времени, то могут появиться проблемы и из-за этого. Опыт придет со временем. Я рекомендую поставить HTerm - в нем можно смотреть по байтам что вы отсылаете/принимаете сразу в hex и ascii (или др. варианты).
Разбирайся Код (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); }