Python逆引き:COMポートを選択してシリアル通信でデータを受信をしたい

備忘録ヘッダ画像 逆引きソースコード

利用するモジュールをインポート

pip install pyserial

コード

COMポートの一覧だけ欲しいなら、search_com_port関数を使う。
receiver関数はシリアル通信でデータを受信して2byte毎に符号なし2byteビッグエンディアンとして整数値に変換する処理を例として記載している。
receiver関数を非同期に呼び出しても良いし、受信したデータをすぐに処理せず、一度queueやバッファにためて余さず処理しても良い。

import serial.tools.list_ports
import serial

def main():
    # test & sample code
    start_serial()

# COMポートを選んでシリアルデータの受信を開始する
def start_serial():
    list = search_com_port()

    for i in range(len(list)):
        print('[' + str(i) + '] : ' + list[i])

    val = input('Enter list number: ')
    com = list[int(val)]

    # ハードに合わせて変える
    con = serial.Serial(
        port = com,
        baudrate = 250000,  
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=None
        )
    
    # 別スレッドにしてこの関数を非同期に呼び出すと良い
    receiver(con)

# COMポート名のリストを取得する
def search_com_port():
    coms = serial.tools.list_ports.comports()
    comlist = []

    for com in coms:
        comlist.append(com.device)
        
    print("Connected COM ports: " + str(comlist))
    return comlist


# 読み出しを行う
def receiver(con):
    SIZE = 2 # 処理したいパケットのByteサイズ

    while 1: # 終了の条件は任意に変更する
        data1 = con.read_all()
        length = len(data1)

        if length != 0:
            pointer = 0

            # 受信データが処理したいパケットサイズより大きかったら処理する
            while(pointer <= length - SIZE):
                # 例えば受信したデータを2byte毎に符号なし2byteビッグエンディアンとして整数値に変換する場合
                data = int.from_bytes(bytes([data1[ pointer], data1[ pointer + 1]]), byteorder='big', signed=False)

                print(data)
                pointer += SIZE
                
            # 他にもファイルに書き出したり好きなようにする

if __name__=="__main__":
    main()

終了処理や、通信開始後の切断~接続復帰の処理は入っていないのでカスタマイズすること。
受信データをバイナリファイルに記録したい場合は、以下を参考にするとよい。

タイトルとURLをコピーしました