Проблема Леонардо

Я свел это к очень простому фрагменту кода:

int testKey;

void setup() {

Serial.begin(9600);

}

void loop() {

Serial.println("Input Source ID "); //Спроси у меня номер

while (Serial.available()==0){ } //Подождите, пока я отвечу

testKey = Serial.parseInt();  //Сохраняем мой ответ в этой переменной

Serial.print("Parsed Input is ");  //Распечатываем результаты на последовательном мониторе

Serial.println(testKey);

}

Когда я запускаю код на своем Leonardo или Uno, я ожидаю, что идентификатор источника ввода будет напечатан на последовательном мониторе. Оно остается пустым (установлено значение 9600 бод). Если я введу 1, последовательный монитор начнет работать. Однако с этого момента он, похоже, снова запрашивает у меня идентификатор и выводит 0 на последовательный монитор:

Проанализированный ввод равен 1
Идентификатор источника ввода
Проанализированный ввод равен 0
Идентификатор источника ввода

Затем он ждет, пока я введу новый идентификатор источника. Если я затем введу 2, я получу это в дополнение к тому, что уже было.

Проанализированный ввод равен 1
Идентификатор источника входного сигнала
Проанализированный ввод равен 0
Идентификатор источника входного сигнала
Проанализированный ввод равен 2
Идентификатор источника входного сигнала
Проанализированный ввод равен 0
Идентификатор источника ввода

Мой вопрос: почему цикл void не запускается автоматически и сразу не предлагает мне ввести данные? Во-вторых, после того, как я присваиваю ему номер, он, кажется, запускает его дважды, вставляя в переменную 0. Почему? Это кажется таким простым, но меня это поставило в тупик. Я попробовал несколько операторов задержки тут и там, но безрезультатно. Заранее спасибо.

, 👍0

Обсуждение

Вы можете установить строку, заканчивающуюся на последовательном мониторе, для всех комбинаций с возвратом каретки и переводом строки. Попробуйте все возможности и вы увидите. Никто из пользователей не использует функции Serial.parse..., они неудобны., @Jot

Хорошо, спасибо вам обоим! Я реализовал ваши предложения и могу получить ожидаемые результаты. Слава вам!, @bigmike333


2 ответа


0

Эта строка:

while (Serial.available()==0){ } //Подождите, пока я отвечу

Не ждет вашего ответа, а только до тех пор, пока не будет введен первый символ. Этот цикл while происходит примерно миллион раз в секунду на Uno. Вы не сможете ввести более одного символа за эту микросекунду. Как только вы его наберете, часы начнут тикать, потому что parseInt() использует тайм-аут. значение, поэтому, если по истечении таймаута не будет введен ни один допустимый цифровой символ , он выйдет из строя. Таймаут по умолчанию составляет 1000 мс (1 секунда).

,

введенное значение отправляется с последовательного монитора после нажатия кнопки «Отправить» или клавиши «Ввод». Даже на скорости 9600 бод разрыв между символами намного меньше секунды., @Juraj

Истинный; Я забыл про последовательный монитор., @jose can u c

и ты планируешь оставить это здесь?, @Juraj

Конечно. Если это плохой ответ, он будет отклонен, как и должно быть., @jose can u c


1

Мой вопрос: почему цикл void не запускается автоматически и сразу не предлагает мне ввести данные?

Да. Однако ваш последовательный монитор в это время не открыт и не может его принять. В отличие от Uno, Leonardo не сбрасывается при открытии последовательного порта.

Обычным решением, чтобы сделать его более похожим на Uno, является добавление:

 while (!Serial);

в setup() после Serial.begin(...), чтобы он ничего не делал, пока вы не откроете последовательный терминал.

Во-вторых, после того, как я присвоил ему номер, он, кажется, запускает его дважды, вставляя в переменную 0. Почему?

Просто: вы анализируете число как число. Затем вы анализируете пустую строку как число.

Если у вас настроен последовательный монитор на отправку CR + LF в качестве окончания строки, вы получите целое число, оканчивающееся CR, за которым следует целое число (представленное 0), а затем LF.

,