День добрый! Пытаюсь считать с Serial порта данные (отправляю через монитор порта в Arduino IDE), например строку 12. И преобразовать в число. Потом вывожу обратно разобранное число. Иногда бывает так, что сначала пишет 1, на следующей строке 2. Разбираю этим кодом: Код (C++): void readFromSerial() { if(Serial.available() > 0) { int ledPort = 0; while(Serial.peek() != -1) { ledPort += Serial.read() - '0'; ledPort *= 10; } ledPort/=10; Serial.println(ledPort); } } Где нужно выждать паузу? Чтобы в буфере была вся строка целиком?
Код (C++): void readFromSerial() { if(Serial.available() > 0) { delay(5); //added int ledPort = 0; while(Serial.peek() != -1) { ledPort += Serial.read() - '0'; ledPort *= 10; } ledPort/=10; Serial.println(ledPort); } } Вот так проблем практически нет. Если поставить задержку 2 или 3 мс, то проблема останется. Как расчитать эту задержку в 5мс? На каждый байт принимаемых данных 1 мс?
в Мониторе порта на PC поменяйте признак конца строки на CR или CR+LF, тогда он будет отсылать данные только при нажатии Return В скетче анализируйте данные только после получения '\n'
што Чтобы в буфере была вся строка целиком. вам его нужно заполнять до тех пор, пока не получите терминатор строки.
Всем спасибо) Выше вы видели пример того, что бывает, если не читать документацию или читать какую-то самопальную)) Тему можно закрывать. Если вдруг кому-то интересно. Код (C++): void serialEvent() { String tempStr = Serial.readStringUntil('\n'); int port = tempStr.substring(0,tempStr.indexOf(' ')).toInt(); int brigthness = tempStr.substring(tempStr.indexOf(' '),tempStr.length()).toInt(); analogWrite(port,brigthness); }
От длины строки не зависит. Другая комбинация сейчас не рассматривается. Сейчас берём строку до '\n', и извлекаем 2 числа разделённых пробелом.
Вот и я о том же. Надо добавлять защиту от дурака. А то придет один символ и \n и систему будет парализована.
Почитайте как организована работа с UART в примере" Офисная активность". Там хорошо показано как с пакетами работать. Под себя переделать не сложно.