Я только учусь. Serial.read(), Serial.println()

Тема в разделе "Arduino & Shields", создана пользователем gv0zd, 25 ноя 2011.

  1. gv0zd

    gv0zd Нуб

    Просматриваю примеры в Wiki
    Видео

    Код (Text):
    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      while (Serial.available() == 0);
      int val = Serial.read();
      Serial.println(val);
    }
    Посылаю 1. В ответ должен получить 49.
    Но получаю 2 строки
    Вношу правки как в видео

    Код (Text):
    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      while (Serial.available() == 0);
      int val = Serial.read() - '0';
      Serial.println(val);
    }
    В ответ вместо 1 получаю :
    Почему такая разница с видео примером, почему в ответ лупит 2 строки?
    Заранее спасибо
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    10 — это перенос строки, обозначаемый как \n. На разных системах по разному принято обозначать новую линию. Так в винде это обычно пара следующих друг за дружкой \r\n, где \r — это символ с кодом 13 называемый возвратом каретки. А в linux перенос строки — это просто \n. Также, например, в протоколе HTTP и формате JSON принято использовать \r\n. В общем, всё зависит от контекста.

    Так вот. Судя по всему, когда вы посылаете данные в serial monitor, на стороне компьютера не съедается \n, съедается только \r. Почему так — отдельный вопрос. Может у кого-нибудь есть идеи? Может дело в настройках Arduino IDE? Но так или иначе, вы можете просто проверять символ на равенство \n и просто игнорировать его в этом случае.
     
  3. gv0zd

    gv0zd Нуб

    Торможу, не додумался в ту же ASCII таблицу посмотреть, что значит 10 :(
    Выбрал в Serial Monitor No line Ending и десятки пропали
    Спасибо

    Тогда еще такой вопрос, он собственно по этой же теме.
    Раньше программил только на PHP там все проще с видами данных.

    Хочу вот такой вот код
    Код (Text):
    int ledPin = 13;
    int wait = 1500;

    void setup() {
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);
    }

    void loop() {
      if (Serial.available()) {
        wait = Serial.read();
        Serial.println(wait);

      }
      digitalWrite(ledPin, HIGH);
      delay(wait);
      digitalWrite(ledPin, LOW);
      delay(wait);
    }
    Засылаю по сериалу 3000
    В ответ получаю
    И диод начинает сумасшедше блымать
    Как мне 4 CHAR 3 0 0 0 превратить в INT 3000
    Гуглю-муглю, не могу найти :(
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    Это довольно просто, хотя и достаточно low-level'ish:

    Код (Text):

    int readSerialInt()
    {
        int result = 0;
        while (Serial.available())
            result = result * 10 + (Serial.read() - '0');
        return result;
    }
     
    Суть понятна думаю: читаем циферки одна за другой и, увеличивая всякий раз временный результат на порядок, в итоге получаем наше значение.
     
  5. gv0zd

    gv0zd Нуб

    Суть понятна
    Спасибо
    Просто понагуглил такое количество разно мудреного кода, что все никак не получалось добитсья нужного результата.
    В реальности же все оказалось гораздо проще
    Еще раз спасибо