Главная chevron_right Функции chevron_right Связь chevron_right Stream.readString()

Stream.readString()

readString() читает все доступные символы из потока и возвращает их как объект String, завершая чтение по истечении таймаута.

Полная статья

Описание

readString() читает все доступные символы из потока и возвращает их в виде объекта String. Чтение не прекращается на каком-то конкретном символе — функция просто ждёт, пока не истечёт таймаут ожидания новых данных. Этот таймаут настраивается через Stream.setTimeout().

В отличие от readBytes(), которая пишет данные в заранее выделенный массив символов, readString() сама создаёт и возвращает объект String. Это делает код короче и нагляднее, но на платах с ограниченной памятью частые операции со String могут приводить к фрагментации кучи — имейте это в виду при разработке долгоживущих проектов.

Метод принадлежит классу Stream и доступен во всех его наследниках: Serial, Wire, сетевых клиентах и других. Подробнее о классе — на странице Stream.

Синтаксис

stream.readString()

Параметры

Нет.

Возвращает

Объект String с символами, накопленными из потока до истечения таймаута. Если за время ожидания не пришло ни одного символа, возвращается пустая строка "".

Тип данных: String.

Пример кода

В примере ниже скетч читает строку из Serial, удаляет пробельные символы по краям и сравнивает результат с ожидаемой командой:

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

void loop() {
  if (Serial.available()) {
    String command = Serial.readString();
    command.trim();

    if (command == "start") {
      Serial.println("Started");
    }
  }
}

Где применяется

  • Команды из Serial Monitor — удобно прочитать всё, что пользователь ввёл и отправил.
  • Прототипы текстовых протоколов — получить весь пришедший фрагмент одним вызовом и разобрать его позже.
  • Диагностические скетчи — когда простота кода важнее экономии памяти.
  • Обработка коротких ответов модулей — если ответ приходит целиком в пределах таймаута.

Практические замечания

  • Функция блокирует выполнение. После получения последнего символа она продолжает ждать до конца таймаута, проверяя, не придут ли ещё данные. Это может заметно тормозить скетч, если данные поступают редко.
  • Символы '\r' и '\n' не отфильтровываются. Если строка пришла из Serial Monitor, в конце почти наверняка окажется символ перевода строки. Вызов trim() помогает от них избавиться.
  • Если сообщение заканчивается разделителем — используйте readStringUntil(). Чтение до конкретного символа, например '\n', работает предсказуемее и не зависит от таймаута.
  • На AVR-платах с малым ОЗУ будьте осторожны. Многократное создание объектов String фрагментирует память. Для надёжных проектов лучше работать с char-буферами фиксированного размера.
  • Пустой результат — не всегда ошибка. Он может означать, что данных не было совсем, или что они не успели прийти до истечения таймаута. Проверяйте оба варианта при отладке.

Примечания и предупреждения

readString() не останавливается на символе новой строки — завершение чтения происходит исключительно по таймауту. Поэтому для построчного ввода, где каждая команда заканчивается переносом строки, удобнее использовать readStringUntil('\n').