Pythonを使用してシリアル通信を行うためのサンプルプログラム

シリアル通信を行う場合、TeraTermなどの汎用ターミナルソフトや一部弊社製品に付属している専用のアプリケーションを用いて行うことも可能ですが、ここではPythonを用いてヒューマンデータ製品と接続・通信する簡単なサンプルをご紹介します。

以下のPythonプログラムは、プログラム内で指定したCOM番号とボーレートでシリアル通信を設定・接続し、データの送受信を行うサンプルプログラムです。
受信処理は別スレッドで実行されるため、受信中も送信が可能であり、接続・送受信・切断といった基本的なシリアル通信の動作の確認を行うことができます。
本プログラムの実行には標準ライブラリの他、シリアルポートを介した送受信の実装に便利なオープンソースライブラリであるPySerialのインストールが必要です。
本プログラムは単独でも動作しますが、GUIなどを含む外部Pythonプログラムから呼び出すことを想定したコールバック関数も含まれています。これについては別記事「PythonによるGUIを用いたシリアル通信のサンプルプログラム」にてご紹介します。

# HuMANDATA LTD. hdlSerial_v21.py
import sys
import threading
import serial
from serial import SerialException


class hdlSerialComm:
    DELIMITERS = {"CR": b"\r", "LF": b"\n", "CRLF": b"\r\n"}

    @staticmethod
    def _notify(callback, message):
        if callback:
            callback(message.replace("\r\n", "\n").replace("\r", "\n").rstrip("\n"))
        else:
            print(message)

    def __init__(self, port=None, baudrate=9600, eol_tx="CR", eol_rx="CR",
                 encoding="utf-8", timeout=1, callback=None, log_callback=None):

        self.port_num = port
        self.baudrate = int(baudrate)
        self.eol_tx = self.DELIMITERS.get(eol_tx, b"\r")
        self.eol_rx = self.DELIMITERS.get(eol_rx, b"\r")
        self.encoding = encoding
        self.timeout = timeout
        self.serial = None
        self.running = False
        self.thread = None
        self.callback = callback
        self.log_callback = log_callback

    def start(self):
        self.running = True
        self.thread = threading.Thread(target=self.recvLoop)  # 受信用スレッド作成、関数指定
        self.thread.start()

    def open(self):
        if self.port_num is None:
            hdlSerialComm._notify(self.log_callback, "Open Error: Port not specified")
            return False
        try:
            self.serial = serial.Serial(
                port=self.port_num,
                baudrate=self.baudrate,
                timeout=self.timeout
            )
            hdlSerialComm._notify(self.log_callback, "Success: Open COM, "+self.port_num)
            return True
        except SerialException as e:
            hdlSerialComm._notify(self.log_callback, "Open Error: "+str(e))
            return False

    def recvLoop(self):
        buf = b""
        while self.running and self.serial.is_open:
            try:
                if self.serial.in_waiting > 0:
                    chunk = self.serial.read(self.serial.in_waiting)  # まとめて読む
                    if not chunk:
                        continue
                    buf += chunk
                while self.eol_rx in buf:
                    line, buf = buf.split(self.eol_rx, 1)  # バッファ内のデータを1行ずつ取り出す
                    data = line.decode(self.encoding, errors="replace")
                    hdlSerialComm._notify(self.callback, data)
            except SerialException as e:
                hdlSerialComm._notify(self.log_callback, "Receive Error: "+str(e))
                break

    def sendData(self, data: str):
        if self.running and self.serial.is_open:
            try:
                self.serial.write(data.encode(self.encoding) + self.eol_tx)
            except SerialException as e:
                hdlSerialComm._notify(self.log_callback, "Send Error: "+str(e))

    def close(self):
        self.running = False
        if self.serial and self.serial.is_open:
            self.serial.close()
        if self.thread:
            self.thread.join(timeout=2)
        hdlSerialComm._notify(self.log_callback, "Port closed")


def main():
    hdlCom = hdlSerialComm(port="COM10", baudrate=9600, )
    if not hdlCom.open():
        sys.exit(1)  # 接続エラーで終了
    hdlCom.start()
    try:
        while True:
            hdlCom.sendData(input())
    except KeyboardInterrupt:
        print("\nEnd: KeyboardInterrupt")
    finally:
        hdlCom.close()


if __name__ == "__main__":
    main()
  • Pythonプログラムの実行には、あらかじめPython実行環境のインストールが必要です。
  • 本プログラムは、Pythonバージョン3.11.9で作成・確認しております。バージョンが異なる場合の動作については未確認です。

以下は、windowsターミナルを用いたプログラムの実行例です。

接続先は例としてUSB-045A(2CH 独立絶縁型 USB 4-20mA 電流モニタ)を使用しております。

  • windowsターミナルはMicrosoftの無料ターミナルアプリです。
  1. ターミナルでhdlSerial_v21.pyを実行すると、プログラム内で指定したCOMポートへの接続を試みます。
    ここで接続が成功すれば、「Success: Open COM」が返ってきます。
  2. 上記の実行例では次に「CST,1」を入力し、送信しています。(「CST」はUSB-045Aの接続確認コマンド)
  3. 次の「OK,CST,1」は接続先(USB-045A)から返ってきた受信データです。

この他、一例として、USB-003USB-010USB-045VなどのCOMポート使用してシリアル通信を行う製品とも同様に接続、通信の確認が可能です。接続・通信時にはそれぞれの製品、環境に応じてCOM番号やシリアル通信の設定の変更が必要になる場合があります。
詳しくは各製品ページやマニュアルをご参照ください。


本プログラムをご利用いただくにあたり、以下の点についてあらかじめご確認ください。

    • 掲載するプログラムは、あくまで弊社製品をご活用いただくための例としてご紹介するものであり、推奨するプログラムということではありません。
    • 十分注意して作成しておりますが、意図せずバグやエラーなどを含む可能性があります。
    • プログラムの使用に起因するトラブルにつきましては補償対象外となります。
    • ご使用前に必ず使用者の責任にて、十分検証の上ご利用ください。
    • 使用されているモジュールなどのライセンスについては、使用範囲に応じてご自身でお確かめください。

ご不明な点や間違い、バグなどありましたらご連絡ください。ご自身の環境に合わせて改良するなど、自由に改変してご活用くださると幸いです。
開発環境の使い方やプログラムの具体的な内容などについては、サポート外となりますのであらかじめご了承ください。

[kw] 2026-02-20 USB シリアル通信 Python プログラム ターミナル TEC-FA


[ ]