Проблема с arduino

egas77

✩✩✩✩✩✩✩
1 Фев 2019
2
0
Всем привет. Заказал себе ардуино т написал первую простую программу.
byte val;

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

void loop() {
if (Serial.available() != 0) {
val = Serial.parseInt();
if (val == 5) {
Serial.println("help");
} else {
Serial.println("12");
}
}
}


При вводе в порт "5" выводит help, и сразу 12
При вводе чего то ещё два раза выводит 12
В чём проблема??
 

Вложения

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Монитор порта по умолчанию, добавляет к твоим отправленным данным символ перевода строки (в низу окна есть выпадающий список, где можно поменять это поведение). Символ "5" ардуина распознает как число 5, а символ переноса строки не может перевести толком в число и считает его нулём. А так как ноль не пять, то ты получаешь в ответ "12".

В протоколе UART нет понятия пакетов, каждый байт передаётся индивидуально. Потому если ты пошлёшь в порт подряд сразу друг за другом "123" и "456", принимающая сторона получит "123456". Функция Serial.parseInt() пытается обойти эту проблему, но по факту только больше запутывает людей. Не пользуйтесь ей. Считывай байтики в буфер, пока не придёт некий символ, который вы договорились считать окончанием команды/числа/пакета данных. Потом уже переводи байтики буфера в число.
 

egas77

✩✩✩✩✩✩✩
1 Фев 2019
2
0
Монитор порта по умолчанию, добавляет к твоим отправленным данным символ перевода строки (в низу окна есть выпадающий список, где можно поменять это поведение). Символ "5" ардуина распознает как число 5, а символ переноса строки не может перевести толком в число и считает его нулём. А так как ноль не пять, то ты получаешь в ответ "12".

В протоколе UART нет понятия пакетов, каждый байт передаётся индивидуально. Потому если ты пошлёшь в порт подряд сразу друг за другом "123" и "456", принимающая сторона получит "123456". Функция Serial.parseInt() пытается обойти эту проблему, но по факту только больше запутывает людей. Не пользуйтесь ей. Считывай байтики в буфер, пока не придёт некий символ, который вы договорились считать окончанием команды/числа/пакета данных. Потом уже переводи байтики буфера в число.
Спасибо вам за подробный ответ, если вам не сложно, сможете на примере показать? Прямо кодом если вам не сложно.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Возьму свои слова обратно, пользуйтесь пока Serial.parseInt(). Ваш скетч будет работать, если вы просто в Мониторе порта отключите символ конца строки. Просто помните, что Serial.parseInt() останавливает выполнение программы где-то на полсекунды-секунду, и что она возвращает 0, если следующий символ в порту не цифра. Когда это станет проблемой, тогда и будете разбираться с парсингом данных.

1549080285694.png
 
  • Лойс +1
Реакции: egas77