2019年10月26日土曜日

Pythonでシリアルポートを自動で選択してみた。

ラズパイ上のPythonでArduinoとかにシリアル通信で接続するときに、通信中に間違ってリセットしたりするとCOMポート番号が変わってしまったりして面倒なので自動でつながるようにしてみた。


import serial.tools.list_ports

ports = list(serial.tools.list_ports.comports())

for p in ports:
    print("Port:" + str(p.device))
    print("VID:0x{:x}".format(int(0 if p.vid is None else p.vid)))
    print("PID:0x{:x}".format(int(0 if p.pid is None else p.pid)))
    print("")
とりあえずPythonでシリアルポートの一覧を作成して各ポートのUSBのVIDとPIDを表示してみる。ラズパイはデフォルトでGPIOにシリアルポートが付いてるのでUSBじゃないシリアルポートに関しては0x0になる。

ためしにこれをこちらの環境で実行すると
Port:/dev/ttyUSB0
VID:0x10c4
PID:0xea60

Port:/dev/ttyAMA0
VID:0x0
PID:0x0
となった。
ttyUSB0は対象のArduinoの情報。ttyAMA0はUSBじゃないのでVIDとPIDが出ない。

というわけでこれを利用して

import serial
import serial.tools.list_ports

ports = list(serial.tools.list_ports.comports())

for p in ports:
    print("Port:" + str(p.device))
    print("VID:0x{:x}".format(int(0 if p.vid is None else p.vid)))
    print("PID:0x{:x}".format(int(0 if p.pid is None else p.pid)))
    print("")
    if(p.vid == 0x10C4 and p.pid == 0xEA60):
        print("Device found")
        ser = serial.Serial(p.device, baudrate=115200,timeout=0.05)
        break

print(ser.readline())
これで特定のVIDとPIDのデバイスを自動で選んで接続してくれるようになった。
これ便利なんだけどVIDとPIDがかぶってたりするとあんまり使えないかも…
listには他にも情報が格納されてるようなのでその中で判別に使えるものがあればよいのだが…(未確認

0 件のコメント:

コメントを投稿