Лишние значения при serial передаче

PavelK2603
Offline
Зарегистрирован: 05.08.2017
01 [code]
02 void setup() {
03   Serial.begin(9600);
04 }
05  
06 void loop() {
07 while(Serial.available() == 0);
08 int val = Serial.read() - '0';
09 Serial.println(val);
10 }
11 [/code]

Простейший код возвращающий введенное число, но у меня возвращаются ещё 2 числа. Так при вводе 1 возвращаются: 1 -35 -38, а без перевода (- '0') это соответствует: 49 13 10. Пробовал на трех платах (две UNO и одна NANO). В чем может быть проблема?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Как всегда проблема в незнании инструмента, которым пользуетесь:

println в отличие от print добавляет в конец символы перевода строки: 13, 10.

PavelK2603
Offline
Зарегистрирован: 05.08.2017

Убрал ln, теперь пишет все тоже самое, только в одну строку

GarryC
Offline
Зарегистрирован: 08.08.2016

Забавная история.
Больше всего порадовал ответ от andriano - как всегда, с апломбом и совершенно не по делу.

Ну а теперь по сути - дело в том, что когда Вы связываетесь с Ардуино через терминал (а, похоже, именно так), то терминал должен понять, что Вы закончили ввод и то, что напечатано на экране, должно быть передано. Для этого Вы нажимаете клавишу "Enter", и с этого момента начинается собственно передача. Но сама по себе данная клавиша создает два символ для передачи, коды которых как раз 13 и 10 (ВК и ПС), которые Вы и принимаете. Посмотрите настройки Вашего терминала, возможно, передачу этих символов можно подавить. Простой способ не заметить данные символы - ввести сравнение с кодом пробела (32) и игнорировать те принятые данные, которые меньше этого значения.

Особую пикантность ситуации придает то, что в эмуляторе Ардуино www.tinkercad.com монитор последовательного порта эти символы на приформировывает и в имитаторе все будет замечательно - приходит один единственный символ ).

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

GarryC пишет:

Больше всего порадовал ответ от andriano - как всегда, с апломбом и совершенно не по делу.

Ну а теперь по сути - дело в том, что когда Вы связываетесь с Ардуино через терминал...

А что, ТС где-то писал про терминал?

Речь, судя по названию, идет о передаче данных через serial, а не о консольном вводе из терминала. Передача подразумевает вывод данных одним устройством и ввод другим. Не следует путать между собой термины ввод, вывод и передача. ТС говорит о передаче, а Вы - о вводе.

PavelK2603
Offline
Зарегистрирован: 05.08.2017

Большое спасибо! Все исправил. Как и сказал GarryC дело было в настройках терминала.

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

Забавная история.
Больше всего порадовал ответ от andriano - как всегда, с апломбом и совершенно не по делу.

интересно, что именно у andriano было не по делу? Он сказал ровно то же самое, что и вы, только короче и без рисовки.

fogary
Offline
Зарегистрирован: 05.03.2016

b707 пишет:

интересно, что именно у andriano было не по делу?

Arduino может сама себя слушать через порт (один и тот же)???

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

fogary пишет:

Arduino может сама себя слушать через порт (один и тот же)???

Ардуино может слушать сама себя даже без порта.

GarryC
Offline
Зарегистрирован: 08.08.2016

Я сказал, что проблема во входном потоке от терминала к Ардуино, и постарался объяснить, в чем именно, а andriano написал об особенностях передачи от Ардуино к терминалу, что не имеет ни малейшего отношения к обсуждаемому вопросу - вот это разница.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

GarryC пишет:

Я сказал, что проблема во входном потоке от терминала к Ардуино, и постарался объяснить, в чем именно, а andriano написал об особенностях передачи от Ардуино к терминалу, что не имеет ни малейшего отношения к обсуждаемому вопросу - вот это разница.

Неправда Ваша.

Я никогда не писал и не подразумевал "от Ардуино к терминалу".

Если под терминалом Вы подразумеваете устройство вывода, значит и процесс должен называться "выводом", а не "передачей".

b707
Offline
Зарегистрирован: 26.05.2017

Да ну что спорить. Совершенно очевидно, что первопричиной проблемы было незнание ТС таких базовых вещей, как существование служебных символов CR LF. А уж в какую сторону он их передавал - дело десятое.

Сдается мне, что после комментария GarryC он просто тупо проделал то, что ему сказали, так и не поняв. в чем собственно была проблема.

GarryC
Offline
Зарегистрирован: 08.08.2016

Если так, то очень жаль, я пытался объяснить явление, а не дать рецепт исправления.

А по поводу реплики andriano, то если println, исполняемая на Ардуино, может передавать данные откуда бы то ни было, кроме как из Ардуино, то я сильно не понимаю свою профессию.
Вместо того, чтобы просто признать, что Вы не совсем поняли ситуацию и считали, будто бы информация передавалась от Ардуино к Ардуино, а не от терминала к Ардуино и назад, что явно следовало из контекста, начинается спор о терминологии и разнице между "выводом" и "передачей" - как же это трудно, признать свою даже не ошибку, а невнимательность.