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, если скетч должен компилироваться на разных платформах.