LoginSignup
2
0
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

Raspberry Pi のUARTを使う場合の注意点

Last updated at Posted at 2024-01-02

はじめに

ラズベリーパイ(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の設定]→[インターフェース]

image.png

ハマった点

 ポートとしては /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'

元記事は下記。

serial_test.py
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()

以上

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0