本サイトは広告・プロモーションが含まれています
Python

【Python】シリアル通信を並列処理する

この記事はこんな人におすすめ

・Pythonを使って装置から出力されるデータを取得したい方
・装置とシリアル通信した結果から、何かプログラムを実行したいと考えている方
・threadの使い方を知りたい方
など

どうもこんにちは。コンです。

今回はPythonを使って装置とシリアル通信することで
データの取得する方法について解説していきたいと思います。

実は前回も書いたのですが
通信の内容によって、カメラを使った写真撮影や温度測定を開始するなどのアクションを実行するケースまでは
書いてなかったなと思い、今回はシリアル通信しつつ別の処理を行うケースについて書いていきたいと思います!!

今回のお題

今回は疑似的にシリアル通信の内容を[“a”, “b”, “c”]のリストのうちランダムで1つ選び、
“b”の通信をPCが受信した時に、「bのデータを受信しました」という内容をコマンドプロンプトに出力する。
という内容で書かせてもらいます。

実際はプログラムとPC以外にも232Cケーブルや、タイプCへの変換ケーブルをつかいます。
オスとメスは装置によるので要チェックです。

プログラム

実際に書いたコードはこちら

import serial
from serial.tools import list_ports
import threading
import random
import time

ser=serial.Serial(
    port='ポートを指定してください',
    baudrate =9600,
    timeout=None,
    parity=serial.PARITY_NONE
)

ser.close()
ser.open()

#シリアル通信でやりとりするデータ
data = None

def serial_manager():
    global data
    while True:
        #通信データ(実際に通信する際はこちらを使う)
        #data =  ser.read_all()

        #今回は疑似的にランダムでデータを取得する
        data = random.choice(["a", "b", "c"])      
        print(data)
        #実際は10秒に1回くらいの通信しかしない。
        time.sleep(3)

def action():
    global data
    while True:
        if data == "b":
            time.sleep(0.1)
            print('bのデータを受信しました')
            data = None


def main():
    thread1 = threading.Thread(target=serial_manager)
    thread2 = threading.Thread(target=action)
    thread1.start()
    thread2.start()

if __name__ == '__main__':
    main()

今回のコードでは2つの関数をスレッド処理でずっとループさせる処理を行なってます。
1つはシリアル通信を行う処理、もう1つは受信したデータが’b’が来たときのアクションです。

この時、やりとりするデータをグローバル変数にすることで、関数間の変数の受け渡しをしています。
なのでserial_manager()とaction()関数で扱う変数dataは同じものになります。

・スレッド処理を使って、信号のやりとりの処理とアクション処理の2つを行う

・グローバル変数を使ってスレッド処理で扱うデータを共有する

おわりに

ここまで読んでいただき、ありがとうございます。

最近はめっきり寒くなってきて体調をくずされる方もいらっしゃるかもしれませんが
ご無理をなさらず、ゆっくりお過ごしください。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA