schedule2018-07-24

ラズパイのGPIOシリアル通信時のエラー:serial.serialutil.SerialException device reports readiness to read but returned no data

はじめに

ラズパイでシリアル通信でのエラーを解決したので、共有のため書きます。

ラズパイでPython3.6のセットアップは、こちらの記事で紹介しています。

ラズパイのGPIOシリアル通信のセットアップ

RaspberryPi3では、/dev/ttyAMA0のポートがデフォルトでBluetooth用に変わったようです。

GPIOピンを/dev/ttyAMA0のポートに設定する方法は、以下を参考しました。

ポートを読むにはsudoを使うため、ローカルのpyenvを使う場合は下の記事を参考にして下さい。

GPIOシリアル通信時のエラー

Pythonで利用するため、pyserialを使います。 シリアルに数値を渡して/dev/ttyAMA0を読んでいるときに以下のエラーが発生しました。

serial_monitor.py

import serial
ser = serial.Serial('/dev/ttyAMA0', 115200)  # 受信用ポートをOpen
while True:
    raw_data = ser.readline()
    # エンコード
    data = raw_data.decode('utf-8').strip()
    print(data)
ser.close()

ポートを監視して、データを読み込みます。

また、シリアル側は別のモジュールから一定の間隔で文字列を送るようにしています。

$ sudo python serial_monitor.py
-60,3,090.9, 87.3,-01.1, 02.4

Exception in thread thread_2:
Traceback (most recent call last):
  File "/home/pi/.pyenv/versions/3.6.6/lib/python3.6/site-packages/serial/serialposix.py", line 501, in read
    'device reports readiness to read but returned no data '
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

portが切れたか、多重に接続したようです。

解決方法

原因は、シリアルポートからシェルのアクセスを許しているためです。

シリアル通信だけ許可して、シェルログインは許可しない設定に変更しましょう。

まず、設定を開きます。

$ sudo raspi-config

no1 5 Interfacing Options ->

no2 P6 Serial ->

no3 Would you like a login shell to be accessible over serial? <No>

no4 Would you like the serial port hardware to be enabled? <Yes>

no5 he serial login shell is disabled The serial interface is enabled <OK>
とする。

$ sudo python serial_monitor.py
-59,3,002.2,-05.4, 01.0, 84.4
-66,1,081.6,-04.5,-02.1,-84.9
-69,3,002.2,-05.5, 01.0, 84.3
-70,3,139.3,-32.6,-16.8,-52.1
-59,1,082.9,-06.1,-01.0,-83.8
-69,3,179.9, 03.3,-00.4,-86.5
-60,1,082.9,-06.1,-01.0,-83.7

読めるようになりました。


Raspberry Piで遊ぼう!

ラズパイを始めて見たい方は、下記の商品がおすすめです。

  • Raspberry Pi3 Model B 本体
  • 電源アダプター
  • 専用ケース
  • スイッチ付きケーブル
  • ヒートシンク

とmicroSDカード以外に、必要なものは全て同梱されています。 (勢い余って)3台購入しましたが、全て問題ありませんでした。

良い点は、maicroSDが選べることです。

必要な容量はOS+ライブラリで約3GBです。8GB以上あれば大丈夫だと思います。

こちらも動作に問題はありません。