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').