簡単に言えば、多くの人がこれに悩まされています。非常に簡単な回避策が次のとおりであることがわかりました。
エラーを無視して tx/rx-ing を維持できます。i2cdetect を呼び出すと、arduino がバスから消えるのではなく、何らかの形でバスが再初期化されるようです。
ここでこのソリューションを見つけた方法の説明を投稿しました(現在modの承認を待っています)
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=41&t=52517
try:
bus.write_i2c_block_data(address, signal, data)
except IOError:
subprocess.call(['i2cdetect', '-y', '1'])
flag = 1 #optional flag to signal your code to resend or something
これにより、Pi は不良データを送信し続けることができますが、依然として arduino に送信されています。これを回避するために私が見つけた最も簡単な方法は、データ ブロックの最後に追加のチェックサム バイトを追加することでした。
バイト変数内のメッセージの各バイトを合計して、値をロールオーバーできるようにし、メッセージ全体を合計してゼロにするために必要な値をチェックサム バイトに割り当てました。
その後、arduino は、すべてのバイトを合計することによって、各着信伝送をチェックできます。メッセージの合計がゼロにならない場合、それは誤った送信として無視されます。
また、送信が成功するたびに増加する 1 バイトのメッセージ ID をメッセージに割り当て、偶発的な二重送信の可能性を排除しました。しかし、それは本当に必要ではないかもしれません。