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

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