Задержка при чтении UART

Тема в разделе "Arduino & Shields", создана пользователем ORLENOK, 19 сен 2017.

  1. ORLENOK

    ORLENOK Гик

    День добрый!

    Пытаюсь считать с 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);
      }
    }
     
    Где нужно выждать паузу? Чтобы в буфере была вся строка целиком?
     
  2. ORLENOK

    ORLENOK Гик

    Код (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 мс?
     
  3. b707

    b707 Гуру

    в Мониторе порта на PC поменяйте признак конца строки на CR или CR+LF, тогда он будет отсылать данные только при нажатии Return
    В скетче анализируйте данные только после получения '\n'
     
    ORLENOK и arkadyf нравится это.
  4. b707

    b707 Гуру

    А еще. есть метод Serial.Event(). а в описании к нему - пример, отлично подходящий к вашей задаче
     
    ORLENOK и arkadyf нравится это.
  5. rkit

    rkit Гуру

    што

    Чтобы в буфере была вся строка целиком. вам его нужно заполнять до тех пор, пока не получите терминатор строки.
     
    ORLENOK и arkadyf нравится это.
  6. rkit

    rkit Гуру

    А если под строкой вы имеете в виду число, то есть готовый метод Serial.parseInt()
     
    ORLENOK и arkadyf нравится это.
  7. ORLENOK

    ORLENOK Гик

    Всем спасибо)
    Выше вы видели пример того, что бывает, если не читать документацию или читать какую-то самопальную))
    Тему можно закрывать.

    Если вдруг кому-то интересно.
    Код (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);
    }
     
    Последнее редактирование: 19 сен 2017
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    Что будет если в порт придет другая комбинация, с иной длиной строки?
     
  9. ORLENOK

    ORLENOK Гик

    От длины строки не зависит. Другая комбинация сейчас не рассматривается.
    Сейчас берём строку до '\n', и извлекаем 2 числа разделённых пробелом.
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    Вот и я о том же. Надо добавлять защиту от дурака.
    А то придет один символ и \n и систему будет парализована.
     
  11. ostrov

    ostrov Гуру

    Почитайте как организована работа с UART в примере" Офисная активность". Там хорошо показано как с пакетами работать. Под себя переделать не сложно.
     
  12. ORLENOK

    ORLENOK Гик

    да я только пробую разные функции, а не пишу финальную версию проекта