Pythonでシリアル通信をやってみた-環境構築と使用例-

Python

Pythonでシリアル通信のプログラムを作成した際、実際に指令を出せているか確認する方法として、仮想シリアル(COM) ポートドライバ「com0com」と「Tera Term」を用いる事が可能です。

ここでは、「com0com」のインストールと「Tera Term」の環境構築方法と、導入〜実践〜トラブル解決までまとめています。

この記事の対象

  • 「com0com」の基本的な使用方法を知りたい方
  • 「Tera Term」の基本的な使用方法を知りたい方
  • pyserialを用いた基本的な使用方法を知りたい方
スポンサーリンク
スポンサーリンク

com0comのインストール

はじめにこちらから「com0com」をインストールします。

「com0com」は仮想シリアル(COM) ポートドライバで有名なフリーソフトになります。

インストールして「コントロール パネル」→「ハードウェアとサウンド」→「デバイスマネージャー」で以下の通り認識していることを確認して下さい。エラー等が出ている場合はこちらのサイトに回避方法が紹介されているので、ご参照下さい。

com0comの設定

「com0com」を立ち上げます。任意のCOMを指定して「Apply」で適用させるだけです。上記はCOM3は送信側、COM4は受信側の仮想シリアルドライバを使ったシリアルポートになります。

OS別:ポート名の探し方

  • WindowsCOM3, COM4 …(デバイス マネージャー→「ポート (COM と LPT)」)
  • Linux/dev/ttyUSB0, /dev/ttyACM0ls /dev/tty*
  • macOS/dev/tty.usbserial-XXXX, /dev/cu.usbmodemXXXXls /dev/tty.* /dev/cu.*

まずは「見えているポート」をPythonから列挙して確認しましょう。

#利用可能なシリアルポートを一覧表示
from serial.tools import list_ports

for p in list_ports.comports():
    print(p.device, p.description, p.vid, p.pid)

Tera Termのインストール

Tera Term」は、Windows上で動作するターミナルエミュレーターの一つです。主にネットワーク機器の設定や管理などで使われ、Telnet、SSH、シリアル接続などの通信プロトコルに対応しています。

上記のリンクから最新のTera Termをインストールします。

インストールしたら起動させます。ここでは、COM4が受信側なので立ち上げ時に指定します。

Pyserialの使用方法

「Pyserial」はPython用のシリアル通信ライブラリです。Pythonプログラムからシリアルポートを使用して、マイコンボードなどとの通信を行うことができます。Windows、Linux、Mac OSなどのOSで使用できます。

外部ライブラリなのでインストールする必要があります。

pip install pyserial

プログラム

文字列の送信

import serial

#1---open
ser = serial.Serial("COM3", 9600)
print(ser.name)

#2---データの送信
ser.write(b'test!!!!')
#3---close
ser.close()

上記のプログラムは接続先のシリアルポートを指定して文字列を書き込む内容になっています。

それでは解説になります。

#1---open
ser = serial.Serial("COM3", 9600)

1の部分ではシリアルポートと通信速度を指定しています。基本的な型としては「serial.Serial(port, baudrate)」になります。「port」には接続先のシリアルポートのデバイス名を指定します。Windowsでは、”COM1″や”COM2″のような形式、Linuxでは、”/dev/ttyACM0″などの形式になります。「baudrate」は通信速度を指定します。

#2---データの送信
ser.write(b'test!!!!')

2の部分では送信するデータを指定します。文字列を送信する場合は、「b'***'」の形式でバイト列に変換してから送信する必要があります。

#3---close
ser.close()

3の部分では、シリアルポートをクローズしています。

結果

行終端(改行)の合わせ方

相手が \n(LF)、\r(CR)、\r\n(CRLF)のどれで送ってくるかで読み取り関数を調整します。

# 4-1. 改行が LF 以外なら read_until で明示
import serial

with serial.Serial("COM4", 9600, timeout=1) as ser:
    EOL = b"\r"  # 相手が CR 終端の場合など
    data = ser.read_until(expected=EOL)
    print(data)

Tera Term での動作確認(任意)

  • 受信側(例:COM4)で Tera Term を開き、ボーレートなど設定を合わせる
  • Python から送信→Tera Term のウィンドウに文字が来れば OK
  • 逆方向も同様にテスト(Tera Term から文字→Python が readline/read_until で受信)

例外処理(安全に閉じる)

import serial, sys

try:
    with serial.Serial("COM4", 9600, timeout=1) as ser:
        ...
except serial.SerialException as e:
    print("ポートにアクセスできません:", e, file=sys.stderr)
    print("・ポートが他のアプリで使用中\n・権限不足(Linux)\n・ケーブル/ドライバ不良 などを確認")

よくあるエラーと対処

Linux: Permission denied: '/dev/ttyUSB0'

  • 対処:ユーザーを dialout グループへ追加 → ログアウト/ログイン
sudo usermod -a -G dialout $USER # 反映には再ログイン(または再起動)が必要 

必要に応じて udev ルールで自動付与。

Windows: Access is denied / 受信が来ない

  • 既に他アプリがポートを開いている(Tera Term/Arduino IDE 等)
  • ボーレート/パリティ/データビット/ストップビット不一致
  • ドライバ(USB-Serial)要確認

行がうまく区切れない / 文字化けする

  • 相手の**行終端(CR/LF/CRLF)**を確認 → read_until(expected=...) で合わせる
  • 文字コード(UTF-8 / Shift_JIS 等)を encode/decode で明示する
  • タイムアウトを適切に設定(timeout / read(size) の組み合わせ)

よく使うパラメータ早見表

項目備考
baudrate9600 / 115200送受双方で一致
bytesizeserial.EIGHTBITS7/8bit
parityserial.PARITY_NONE偶数/奇数なら EVEN/ODD
stopbitsserial.STOPBITS_ONE1/1.5/2
timeout1.0秒(None=無限待ち, 0=ノンブロッキング)
xonxoffFalseソフトウェアフロー制御
rtscts / dsrdtrFalseハードウェアフロー制御

pySerial スクリプト自動生成

使い方:上の入力 →「コード生成」→ Python ファイルに貼って実行(事前に pip install pyserial)。

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