Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ハードウェアリセット直後に OSError: [Errno 121] Remote I/O error #38

Open
miminashi opened this issue Jul 17, 2018 · 1 comment

Comments

@miminashi
Copy link

ハードウェアリセット直後にget_is_online()を呼ぶと、I2Cの準備が完了していないのか、Remote I/O errorになります。
sakura.ioモジュールのI2Cがreadyかどうかの判断はどのようにすべきでしょうか?

$ echo 22 > /sys/class/gpio/export; \
echo out > /sys/class/gpio/gpio22/direction; \
echo 1 > /sys/class/gpio/gpio22/value; sleep 0.1; \
echo 0 > /sys/class/gpio/gpio22/value; \
python3 -c "from sakuraio.hardware.rpi import SakuraIOSMBus;print(SakuraIOSMBus().get_is_online())"
-bash: echo: write error: Device or resource busy
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/sakuraio/hardware/commands/common.py", line 34, in get_is_online
    status = self.get_connection_status()
  File "/usr/local/lib/python3.5/dist-packages/sakuraio/hardware/commands/common.py", line 24, in get_connection_status
    response = self.execute_command(CMD_GET_CONNECTION_STATUS)
  File "/usr/local/lib/python3.5/dist-packages/sakuraio/hardware/base.py", line 44, in execute_command
    self.start(False)
  File "/usr/local/lib/python3.5/dist-packages/sakuraio/hardware/rpi/__init__.py", line 16, in start
    self.bus.write_i2c_block_data(SAKURAIO_SLAVE_ADDR, self.request[0], self.request[1:])
OSError: [Errno 121] Remote I/O error

とりあえず、ハードウェアリセットからI2Cアクセスまで2秒くらい待機することで回避しています。

@f-okuhara
Copy link
Contributor

ご指摘の通り、sakura.ioモジュールのI2CがReadyになる前にアクセスしているので例外が発生しています。
例外が発生した場合は少し時間を置いてリトライするようにしていただければと思います。
以下のようなコードになるかと思います。(実際には動かしていないコードなのでご参考までに)

sakuraio = SakuraIOSMBus()

while True:
	try:
		ret = sakuraio.get_is_online()
		if (ret & 0x80) == 0x80:
			break
	except:
		pass

	time.sleep(0.1)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants