はじめに
ラズベリーパイ(Raspberry Pi / Raspberry Pi Zero) のUARTをPythonで使う際、UARTのポートが出現せずハマったのでまとめる。
参考にしたサイト
https://www.ingenious.jp/articles/howto/raspberry-pi-howto/gpio-uart/
UARTの設定
ラズベリーパイでUARTを使う場合はシリアルポートを有効にする。シリアルコンソールと共用しているのでUARTを使う場合はシリアルコンソールをOFFにする。
[設定]→[Raspberry Piの設定]→[インターフェース]
ハマった点
ポートとしては /dev/ttyAMA0
がでてきたので選択したが動作しない。ラズベリーパイのUARTを使う場合は、miniUARTという機能が使われているようで、ポートは /dev/ttyS0
で割ついてこちらを選択する必要がある。
ただ /dev/ttyS0 がなぜか Pythonライブラリpyserialの serial.tools.list_ports.comports()
でリストとして出てこない。理由は不明だが、同じような投稿があったので私だけでは無いよう。(https://forums.raspberrypi.com/viewtopic.php?t=344916) 解決策がわからないので、仕方なく、直接/dev/ttyS0を直接呼び出すとうまく動作した。
強引だけど作ったPythonコード
RaspberryPiでUART制御する際、/dev/ttyS0を自動検出しないので、下記行を追加。
if '/dev/ttyAMA0' in serial_ports.values():
serial_ports[str(len(serial_ports))]='/dev/ttyS0'
元記事は下記。
import os
import serial
import serial.tools.list_ports
import threading
#----------------------
# データを送信
#----------------------
def serial_write():
global Serial_Port
while(1):
if Serial_Port !='':
data=input()+'\r\n'
data=data.encode('utf-8')
Serial_Port.write(data)
#----------------------
# データを受信
#----------------------
def serial_read():
global Serial_Port
while(1):
if Serial_Port !='':
#data=Serial_Port.read(1)
data=Serial_Port.readline()
data=data.strip()
data=data.decode('utf-8')
print(data)
#----------------------
# シリアルポートをOpen
#----------------------
def serial_open():
global Serial_Port
#portリストを取得
serial_ports={}
for i,port in enumerate(serial.tools.list_ports.comports()):
serial_ports[str(i)]=port.device
#RaspberryPiのminiUART検出できないので、/dev/ttyAMA0があれば自動的に/dev/ttyS0を追加
if '/dev/ttyAMA0' in serial_ports.values():
serial_ports[str(len(serial_ports))]='/dev/ttyS0'
port_val = serial_ports[ input(f'ポート番号を選んでください。{serial_ports}:') ]
boud_val = int(input('ボーレートbpsを数値で入力してください。:'))
prty_val = input(f'パリティーを選んでください。[N:None, O:Odd, E:Even]:')
Serial_Port=serial.Serial(port=port_val, baudrate=boud_val, parity= prty_val)
print(f'open{port_val}/{boud_val}bps/parity:{prty_val}')
if __name__ == '__main__':
Serial_Port=''
#port open
serial_open()
thread_1 = threading.Thread(target=serial_write)
thread_2 = threading.Thread(target=serial_read)
thread_1.start()
thread_2.start()
以上