Serial.setTimeout()
Serial.setTimeout() задаёт, сколько миллисекунд функции чтения (Serial.readBytes(), Serial.parseInt() и другие) будут ждать данных, прежде чем вернуть управление скетчу.
Полная статья
Описание
Когда Arduino ждёт данных через последовательный порт, некоторые функции не возвращают управление сразу — они блокируют выполнение скетча до тех пор, пока не получат нужное количество байт или не истечёт таймаут. Именно это время ожидания и задаёт Serial.setTimeout(): если данные не пришли за отведённый срок, функция завершается с тем, что успела получить.
По умолчанию таймаут равен 1000 миллисекунд (1 секунда). Это разумное значение для большинства случаев, но иногда его нужно уменьшить (чтобы скетч реагировал быстрее) или увеличить (если источник данных медленный).
Serial.setTimeout() наследует от класса Stream.
Синтаксис
Serial.setTimeout(time)
Параметры
Serial— объект последовательного порта. На платах с несколькими UART можно использоватьSerial1,Serial2и т. д. Список доступных портов для каждой платы см. на странице Serial.time— время ожидания в миллисекундах. Тип данных:long.
Возвращает
Ничего.
Пример кода
Следующий код уменьшает таймаут последовательного порта по сравнению со значением по умолчанию:
char data[6]; // 5 символов + нулевой терминатор
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.setTimeout(5000); // Установить таймаут 5 секунд
Serial.println("Send 5 characters (you have 5 seconds):");
}
void loop() {
if (Serial.available()) {
int bytesRead = Serial.readBytes(data, 5);
data[bytesRead] = '\0';
Serial.print("Received: ");
Serial.println(data);
}
}
На какие функции влияет таймаут
Значение, заданное через Serial.setTimeout(), используется следующими функциями:
Serial.find()Serial.findUntil()Serial.parseInt()Serial.parseFloat()Serial.readBytes()Serial.readBytesUntil()Serial.readString()Serial.readStringUntil()
Где применяется
- Приём команд с компьютера — если оператор вводит данные вручную, 1 секунда обычно достаточна. Но если скетч должен реагировать на другие события, таймаут стоит сократить.
- Обмен с внешним устройством — модуль GPS, GSM-модем или датчик могут отвечать медленнее стандартного таймаута; тогда его увеличивают, чтобы не обрывать приём данных.
- Парсинг чисел —
Serial.parseInt()иSerial.parseFloat()ждут цифры именно столько, сколько задано таймаутом. Если пауза между символами больше таймаута, функция вернёт то, что успела разобрать. - Быстрые протоколы — при высокой скорости обмена (например, 115200 бод) таймаут можно уменьшить до 10–50 мс, чтобы скетч не «зависал» в ожидании.
Практические замечания
- Вызывайте
Serial.setTimeout()послеSerial.begin()— до инициализации порта установка таймаута не имеет смысла. - Слишком маленький таймаут может привести к тому, что функции чтения будут возвращать пустые строки или неполные данные, если передача идёт с паузами между байтами.
- Слишком большой таймаут блокирует выполнение
loop()на всё время ожидания — другие части скетча в это время не работают. - Если вы используете несколько последовательных портов, каждый из них имеет свой таймаут. Вызывайте
Serial.setTimeout()отдельно для каждого объекта. - Таймаут задаётся один раз и остаётся в силе до следующего вызова
Serial.setTimeout()или до перезагрузки платы.