Проблема Леонардо
Я свел это к очень простому фрагменту кода:
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. Почему? Это кажется таким простым, но меня это поставило в тупик. Я попробовал несколько операторов задержки тут и там, но безрезультатно. Заранее спасибо.
@bigmike333, 👍0
Обсуждение2 ответа
Эта строка:
while (Serial.available()==0){ } //Подождите, пока я отвечу
Не ждет вашего ответа, а только до тех пор, пока не будет введен первый символ. Этот цикл while происходит примерно миллион раз в секунду на Uno. Вы не сможете ввести более одного символа за эту микросекунду. Как только вы его наберете, часы начнут тикать, потому что parseInt()
использует тайм-аут. значение, поэтому, если по истечении таймаута не будет введен ни один допустимый цифровой символ , он выйдет из строя. Таймаут по умолчанию составляет 1000 мс (1 секунда).
введенное значение отправляется с последовательного монитора после нажатия кнопки «Отправить» или клавиши «Ввод». Даже на скорости 9600 бод разрыв между символами намного меньше секунды., @Juraj
Истинный; Я забыл про последовательный монитор., @jose can u c
и ты планируешь оставить это здесь?, @Juraj
Конечно. Если это плохой ответ, он будет отклонен, как и должно быть., @jose can u c
Мой вопрос: почему цикл void не запускается автоматически и сразу не предлагает мне ввести данные?
Да. Однако ваш последовательный монитор в это время не открыт и не может его принять. В отличие от Uno, Leonardo не сбрасывается при открытии последовательного порта.
Обычным решением, чтобы сделать его более похожим на Uno, является добавление:
while (!Serial);
в setup()
после Serial.begin(...)
, чтобы он ничего не делал, пока вы не откроете последовательный терминал.
Во-вторых, после того, как я присвоил ему номер, он, кажется, запускает его дважды, вставляя в переменную 0. Почему?
Просто: вы анализируете число как число. Затем вы анализируете пустую строку как число.
Если у вас настроен последовательный монитор на отправку CR + LF в качестве окончания строки, вы получите целое число, оканчивающееся CR, за которым следует целое число (представленное 0), а затем LF.
- Как использовать SPI на Arduino?
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Отправка цифрового сигнала с одного Arduino на другой для запуска события
- Программирование Arduino с помощью FTDI через контакты Tx и Rx
- Не удается заставить клавиатуру использовать Keyboard.write на Arduino Uno
- Несколько срочных задач
- Подключите Arduino к LiDAR через RS-232
- Размер флешки в boards.txt ATmega 328p 32u4
Вы можете установить строку, заканчивающуюся на последовательном мониторе, для всех комбинаций с возвратом каретки и переводом строки. Попробуйте все возможности и вы увидите. Никто из пользователей не использует функции Serial.parse..., они неудобны., @Jot
Хорошо, спасибо вам обоим! Я реализовал ваши предложения и могу получить ожидаемые результаты. Слава вам!, @bigmike333