名称
Wire.setWireTimeout()
説明
setWireTimeout()は、コントローラーモードで利用するときの、通信タイムアウトを設定する。
パラメータなしで呼び出されたときは、デフォルトのタイムアウトが設定される。これは、典型的な単一コントローラ設定でのロックアップを防ぐには十分な値である。
この関数はWireライブラリの一部である。詳細はWireメインページを参照のこと。
書式
Wire.setWireTimeout(timeout, reset_on_timeout)Wire.setWireTimeout()
C言語シグネチャ(avr)
void TwoWire::setWireTimeout(uint32_t timeout, bool reset_with_timeout);
引数
| timeout | タイムアウト(ミリ秒単位)。0のときは、タイムアウトは無効。デフォルト値は25000。データ型: uint32_t。 |
| reset_on_timeout | trueの場合、タイムアウト時にWireハードウェアを自動リセットする。データ型: bool。 |
戻り値
なし。
コード例
|
|
注意と警告
タイムアウトの理解: タイムアウトは、デバイスの問題や雑音、不十分な絶縁、他の電気的な問題などがおこっていることを示唆する。タイムアウトはスケッチが停止するのを防ぐが、問題を解決するわけではない。このような場合、タイムアウトによっては検出されないデータ破損が発生している可能性もある。このため、タイムアウトが発生したときは、以前に送受信したデータも破損している可能性がある。このような問題をより確実に検出するための手段(チェックサムや書き込んだ値を読み戻す)が必要になるかもしれない。タイムアウトや追加の手段は最終的な防御策であり、本来は根本的な原因を解決する必要がある。
タイムアウトの動作: 典型的には、トランザクションが完了するのを待っているとき(例えば、バスが再度利用可能になるのを待つ、ACKビットを待つ、全トランザクションが終了するのを待つなど)に、タイムアウト条件が発生する。タイムアウト状態がおこると、トランザクションは中断され、Wire.endTransmission()やWire.requestFrom()が、それぞれ、エラーコードやゼロバイトを返す。
ハードウェアリセット: reset_on_timeoutがtrueに設定され、プラットフォームがこれをサポートしている場合は、I2Cハードウェアがリセットされる。これは、I2Cハードウェアモジュール内の不正な状態を解消するのに役立つ。
タイムアウトフラグ: タイムアウトが起こると、Wire.getWireTimeoutFlag()によって検出できるフラグが設定される。これは、Wire.clearWireTimeoutFlag()を使って手動でクリアする必要がある(Wire.setWireTimeout()を呼び出したときにもクリアされる)。
推奨値: 典型的なタイムアウトは25ms(SMBusプロトコルで許されるクロックストレッチの最大値)だが、(かなり)短い値でも通常は動作する。必要に応じて、クロックストレッチやマルチコントローラ構成に対応できるよう、タイムアウト時間を適切に設定すること。
ポータビリティ: この関数はWireライブラリの基のバージョンでは利用できない。また、全てのプラットフォームで利用できるわけでもない。プラットフォームやバージョン間の互換が必要な場合は、Wire.setWireTimeout()とWire.getWireTimeoutFlag()、Wire.clearWireTimeout()が利用できるときにだけ定義されるWIRE_HAS_TIMEOUTマクロを利用する。
デフォルト値: デフォルトのタイムアウト設定は、WIRE_DEFAULT_TIMEOUTとWIRE_DEFAULT_RESET_WITH_TIMEOUTマクロとして利用できる。タイムアウトを無効にするには、現状はデフォルト値ではあるが、setWireTimeout(0)を利用することが推奨されている。
オリジナルのページ
https://docs.arduino.cc/language-reference/en/functions/communication/wire/setWireTimeout/
最終更新日
August 16, 2026