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

Serial.getTimeout()

Serial.getTimeout() возвращает текущий таймаут ожидания данных (в мс) — значение типа unsigned long, установленное через Serial.setTimeout().

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

Описание

Serial.getTimeout() позволяет узнать, какой таймаут в данный момент установлен для операций чтения из последовательного порта. Это значение задаётся с помощью Serial.setTimeout() и определяет, сколько миллисекунд функции вроде readString() или parseInt() будут ждать поступления данных.

По умолчанию таймаут равен 1000 мс. Если вы меняете его в ходе работы программы, getTimeout() поможет убедиться, что нужное значение действительно установлено — это особенно удобно при отладке.

Serial.getTimeout() наследуется от класса Stream.

Синтаксис

Serial.getTimeout()

Параметры

Serial — объект последовательного порта. Список доступных портов для каждой платы смотрите на странице Serial.

Возвращает

Текущее значение таймаута, ранее установленное через Serial.setTimeout(). Тип данных: unsigned long.

Пример кода

Следующий скетч изменяет таймаут по умолчанию и предлагает ввести что-нибудь в Serial Monitor за отведённое время:

void setup() {
  Serial.begin(9600);
  while (!Serial);  // Ожидание готовности Serial (для плат с USB)

  Serial.print("Current timeout (ms): ");
  Serial.println(Serial.getTimeout());  // Вывод таймаута по умолчанию (должно быть 1000)

  Serial.setTimeout(5000);  // Установка пользовательского таймаута (5 секунд)

  Serial.print("New timeout set to: ");
  Serial.println(Serial.getTimeout());  // Теперь должно быть 5000

  Serial.println("Type something within 5 seconds:");
}

void loop() {
  char buffer[20];
  int bytesRead = Serial.readBytes(buffer, sizeof(buffer) - 1);  // Ожидание до истечения таймаута

  if (bytesRead > 0) {
    buffer[bytesRead] = '\0';  // Завершение строки нулевым символом
    Serial.print("Received: ");
    Serial.println(buffer);
  } else {
    Serial.println("Timeout! No data received.");
  }

  delay(3000);
}

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

  • Проверка конфигурации — убедиться, что setTimeout() сработал корректно, прежде чем начать ждать данные.
  • Адаптивный приём — в сложных протоколах, где таймаут меняется в зависимости от режима работы, getTimeout() позволяет сохранить текущее значение, изменить его временно, а затем восстановить.
  • Отладка — вывести текущий таймаут в Serial Monitor, чтобы понять, почему функции чтения завершаются раньше или позже ожидаемого.

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

  • Если вы ни разу не вызывали setTimeout(), getTimeout() вернёт 1000 — это значение по умолчанию.
  • Возвращаемый тип unsigned long означает, что значение всегда неотрицательное; передавать отрицательное число в setTimeout() не имеет смысла.
  • Функция не блокирует выполнение программы и не взаимодействует с буфером — она просто читает сохранённое число.
  • Если вы работаете с несколькими последовательными портами (например, Serial1, Serial2), каждый из них хранит собственное значение таймаута, и getTimeout() нужно вызывать для нужного объекта.
  • Слишком маленький таймаут (например, 10–50 мс) может приводить к тому, что функции чтения возвращают пустую строку или неполные данные — getTimeout() поможет быстро диагностировать эту ситуацию.

Полезные материалы