【Python】シリアル通信をマスター!仮想ポートの作成からpyserialの使い方まで

この記事は約6分で読めます。

組Pythonでハードウェア(マイコンやセンサーなど)と通信する際によく使われるのが「シリアル通信」です。

しかし、「手元に通信をテストするハードウェアがない…」という場合でも大丈夫です。PC内に「仮想ポート」を作成すれば、1台のPCの中で送信と受信のテストを簡単に行うことができます。

この記事では、仮想ポートの準備から、Pythonのライブラリpyserialを使ったシリアル通信の実装方法までをわかりやすく解説します。

1. 仮想ポート(com0com)の準備

まずはPC内に仮想のシリアルポートを作成します。ここでは定番のフリーソフト「com0com」を使用した手順を解説します。

不要なポートの削除と新規作成

ソフトを起動すると設定画面が表示されます。

  1. 初期設定の削除:最初はややこしいので、デフォルトで存在している「Virtual Port Pair 0」と「1」を削除します。画面上がスッキリし、すべて削除完了となればOKです。
  2. ポートの作成:「Add Pair」をクリックし、新しいポートのペアを作成します。
  3. 名前の変更:作成されたポートの名前を、分かりやすく「COM1」「COM2」などに変更します。
  4. 適用:「Apply」をクリックして適用します(他のチェックボックスはとりあえず無視で大丈夫です)。

これで仮想ポートの生成は完了です!

デバイスマネージャーで確認

本当に生成できているか、Windowsの機能で確認しましょう。

  1. Windowsマークを右クリックし、「デバイスマネージャー」を起動します。
  2. 「com0com」の項目を探し、先ほど設定した名前(COM1、COM2など)が表示されているか確認してください。

⚠️ 注意:警告マークが出ている場合 ポートのアイコンに「△」マークがついており、「デジタル署名がない」と警告が出ている場合は、右クリックして「ドライバーの更新」を行い、適切なドライバをダウンロードして適用してください。

これで準備は完了です!続いてPython側の処理を作っていきましょう。

2. pyserialのインストール

Pythonでシリアル通信を行うためには、pyserialというライブラリが必要です。 コマンドプロンプト(またはターミナル)を開き、以下のpipコマンドでインストールしてください。

pip install pyserial

3. 実践!送受信プログラムの作成

インストールが完了したら、実際にプログラムを書いてみましょう。今回は「送信側(COM1)」と「受信側(COM2)」の2つのプログラムを用意します。

送信プログラム

COM1ポートを開き、「hello」という文字列を送信するシンプルなコードです。

import serial

def main_func():
    # COM1をボーレート115200でオープン(タイムアウト1秒)
    ser = serial.Serial('COM1', 115200, timeout=1)
    
    # データを送信(文字列をバイト列にエンコード)
    ser.write(str.encode('hello\n'))
    
    # 使い終わったら必ず閉じる
    ser.close()

if __name__ == '__main__':
    main_func()

受信プログラム

COM2ポートを開き、データが送られてくるのを待ち受けるコードです。

import serial

def main_func():
    # COM2をボーレート115200でオープン(タイムアウト0.1秒)
    ser = serial.Serial('COM2', 115200, timeout=0.1)
    
    while True:
        try:
            # 1行読み込み
            data = ser.readline()
            
            # データが空でなければ表示
            if len(data) != 0:
                print(data)
                
        except KeyboardInterrupt:
            # Ctrl+Cが押されたらループを抜ける
            break
            
    # 終了時にポートを閉じる
    ser.close()

if __name__ == '__main__':
    main_func()

4. pyserialの使い方の流れと重要な注意点

pyserialを使ったプログラミングは、基本的に以下の3ステップで行います。

① シリアルポートのオープン

ser = serial.Serial('COM2', 115200, timeout=0.1)

第1引数で「COMポート名」、第2引数で通信速度である「ボーレート」を指定します。 そして重要なのが、第3引数のタイムアウト時間(timeout)です。これを設定しないと、データが来ない時にプログラムが永遠に待ち続けてしまいます。

② データの送受信

ser.write(str.encode('hello\n'))  # 送信
data = ser.readline()             # 1行受信(サイズ指定のread()も可能)

🚨 ここが落とし穴!同期関数によるフリーズ pyserialの送受信関数(readやwriteなど)は同期関数です。つまり、相手からのアクションやデータがないと、この関数から処理が戻ってこなくなり、プログラム全体が停止(フリーズ)してしまいます。 (コマンドプロンプトからの強制終了すら受け付けなくなることもあります)

【対策】 この問題を回避し、メインの処理を止めずにシリアル通信を行うにはマルチスレッドを併用するのが一般的でおすすめです。

💡 マルチスレッドの実装方法については、以下の記事で詳しく解説しています。PythonでPyaudioを使ってマイク音声をリアルタイムに保存する方法 – マルチスレッド活用

③ ポートのクローズ

ser.close()

最後はポートのクローズです。ポートを開きっぱなしでアプリを強制終了したりすると、PCがポートを「使用中」と勘違いし、次回オープンできなくなるトラブルが発生します。 おまじないとして、プログラムの最後には必ずclose()を行うようにしてください。

まとめ

この記事では、Pythonでシリアル通信を行う方法について解説しました。

  • com0comを使えば、PC内に仮想ポート(COM1とCOM2など)を作って通信テストができる。
  • Pythonでの通信はpip install pyserialでライブラリを入れるだけで実装可能。
  • 処理の流れは「オープン → 送受信 → クローズ」の3ステップ。
  • 送受信はプログラムが止まりやすい(同期関数)ため、タイムアウトの設定やマルチスレッドの併用が重要。

シリアル通信はコードの記述自体はシンプルですが、正しく実装しないと「処理が返ってこない」「ポートが開けない」などのトラブルが起きやすい分野でもあります。今回の注意点を意識しながら、安全なプログラムを作成してみてください!

コメント

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