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

Wire.clearWireTimeoutFlag()

Wire.clearWireTimeoutFlag() сбрасывает флаг тайм-аута I2C-шины, чтобы Wire.getWireTimeoutFlag() после следующей транзакции отражал именно её результат, а не ошибку из прошлого обмена.

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

Описание

clearWireTimeoutFlag() сбрасывает флаг тайм-аута, который библиотека устанавливает автоматически, если во время I2C-обмена произошёл тайм-аут.

Флаг работает по принципу «защёлки»: как только тайм-аут случился, флаг остаётся взведённым до явного сброса — именно для этого и нужна clearWireTimeoutFlag(). Без вызова этой функции Wire.getWireTimeoutFlag() будет возвращать true даже после того, как шина восстановилась и обмен снова идёт нормально.

Типичный паттерн использования: перед началом важной транзакции вызвать clearWireTimeoutFlag(), выполнить обмен, а затем проверить Wire.getWireTimeoutFlag() — если флаг снова взведён, значит именно эта транзакция завершилась с тайм-аутом.

Тайм-ауты могут быть отключены по умолчанию. Подробнее о настройке их поведения — в документации к Wire.setWireTimeout().

Эта функция входит в состав библиотеки Wire.

Синтаксис

Wire.clearWireTimeoutFlag()

Параметры

Нет.

Возвращает

Ничего.

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

  • Опрос нескольких I2C-устройств в цикле: перед каждой итерацией сбрасываем флаг, чтобы точно знать, какое именно устройство вызвало проблему.
  • Восстановление после зависания шины: после попытки переинициализации сбрасываем флаг и проверяем, помогло ли это.
  • Диагностика в отладочном режиме: выводим в Serial сообщение о тайм-ауте, сбрасываем флаг и продолжаем работу, не останавливая скетч.

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

  • Вызывайте clearWireTimeoutFlag() перед транзакцией, а не после — тогда Wire.getWireTimeoutFlag() после транзакции покажет именно её результат, а не «хвост» от предыдущей ошибки.
  • Функция не восстанавливает шину и не повторяет передачу — она только сбрасывает флаг в программе.
  • Если тайм-ауты не были включены через Wire.setWireTimeout(), флаг никогда не взводится, и вызов clearWireTimeoutFlag() безвреден, но бессмысленен.
  • Функция не блокирует выполнение и возвращает управление мгновенно.

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

Эта функция отсутствовала в исходной версии библиотеки Wire и может быть недоступна на всех платформах. Для написания переносимого кода используйте макрос WIRE_HAS_TIMEOUT: он определяется только тогда, когда Wire.setWireTimeout(), Wire.getWireTimeoutFlag() и Wire.clearWireTimeoutFlag() доступны одновременно. Оборачивайте соответствующий код в #ifdef WIRE_HAS_TIMEOUT ... #endif, если скетч должен компилироваться на разных платформах.