はじめに
ラズパイでシリアル通信でのエラーを解決したので、共有のため書きます。
ラズパイで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
5 Interfacing Options
->
P6 Serial
->
Would you like a login shell to be accessible over serial? <No>
Would you like the serial port hardware to be enabled? <Yes>
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以上あれば大丈夫だと思います。
こちらも動作に問題はありません。