Wire.getWireTimeoutFlag()
Wire.getWireTimeoutFlag() возвращает true, если с момента последнего сброса на шине I²C хотя бы раз произошёл тайм-аут — флаг остаётся установленным до явного вызова Wire.clearWireTimeoutFlag().
Полная статья
Описание
getWireTimeoutFlag() читает внутренний флаг тайм-аута библиотеки Wire. Флаг устанавливается автоматически каждый раз, когда операция на шине I²C превышает допустимое время ожидания, и остаётся установленным до явного сброса.
Сбросить флаг можно двумя способами: вызвать Wire.clearWireTimeoutFlag() вручную или изменить настройки тайм-аута через Wire.setWireTimeout() — второй вариант тоже обнуляет флаг как побочный эффект.
Функция входит в состав библиотеки Wire.
Где применяется
- Диагностика зависания шины — если устройство на I²C не отвечает или удерживает линию, флаг тайм-аута покажет, что обмен не завершился корректно.
- Восстановление после ошибок — в цикле опроса нескольких устройств можно проверять флаг после каждой транзакции и пропускать сбойное устройство, не блокируя остальные.
- Отладка нестабильной шины — при подозрении на плохой контакт или неверное подтягивающее сопротивление флаг помогает зафиксировать факт сбоя без осциллографа.
Синтаксис
Wire.getWireTimeoutFlag()
Параметры
Функция не принимает аргументов.
Возвращает
true, если тайм-аут произошёл хотя бы один раз с момента последнего сброса флага; false, если тайм-аутов не было. Тип возвращаемого значения: bool.
Как читать результат
Флаг работает по принципу «защёлки»: одного тайм-аута достаточно, чтобы он стал true, и он останется true при следующих успешных транзакциях — пока вы явно его не сбросите. Это удобно: даже редкий кратковременный сбой не останется незамеченным. Если вы хотите отслеживать каждую транзакцию по отдельности, сбрасывайте флаг через Wire.clearWireTimeoutFlag() перед каждым обращением к шине.
Практические замечания
- Функция только читает флаг — она не сбрасывает его. Для сброса используйте
Wire.clearWireTimeoutFlag(). - Если
Wire.getWireTimeoutFlag()постоянно возвращаетtrue, в первую очередь проверьте подтягивающие резисторы на линиях SDA и SCL и правильность адреса устройства. - Тайм-аут должен быть предварительно настроен через
Wire.setWireTimeout(); без этого механизм тайм-аута может быть отключён, и флаг не будет устанавливаться. - Флаг сбрасывается при вызове
Wire.setWireTimeout(), даже если новое значение тайм-аута совпадает со старым — учитывайте это, если меняете настройки динамически.
Примечания и предупреждения
Функция отсутствовала в исходной версии библиотеки Wire и может быть недоступна на некоторых платформах. Если вы пишете код, рассчитанный на работу с разными платами и версиями библиотеки, используйте макрос WIRE_HAS_TIMEOUT: он определяется только тогда, когда Wire.setWireTimeout(), Wire.getWireTimeoutFlag() и Wire.clearWireTimeoutFlag() одновременно доступны. Оборачивайте вызовы этих функций в #ifdef WIRE_HAS_TIMEOUT ... #endif, чтобы код компилировался корректно на любой платформе.