エンジニアライフスタイルブログを運営しているミウラ(@miumiu06171)です。
普段はフリーランスでシステムエンジニアをしております。
今回は、Pythonのpyserialモジュールを使ったシリアル通信の使い方と実際にシリアル通信を確認する方法を紹介していきます。
シリアル通信を確認するためにVisual Studio Code (VS Code) を使用しているため、同様に確認したい方は、こちらの記事でVS CodeでPythonの開発環境を構築してみてください。
シリアル通信とは
シリアル通信とは、1つのデータ伝送路で2つの機器間をつなぎ、データを1ビットずつ連続的に送受信する通信方式のことです。
仮想シリアルドライバを使ったシリアル通信の準備
あなたのPC本体のみでは通信相手がいないため、本来シリアル通信はできません。
そのため、今回は仮想シリアルドライバとTeraTermを使って通信相手を準備します。
仮想シリアルドライバ(com0com)のインストール
仮想シリアルドライバとしてcom0comというソフトを使用します。
com0comのインストールについては、こちらのサイトを参考にインストールしてください。
仮想シリアルドライバ(com0com)の設定
仮想シリアルドライバcom0comをインストールできたら、com0comのGUIを起動し、以下のようにCOM11とCOM12の2つを用意しよう。
下図のように設定することでCOM11は送信側、COM12は受信側の仮想シリアルドライバを使ったシリアルポートになります。
TeraTermのインストール
ここでは、Pythonで作るシリアル通信プログラムの通信相手としてTeraTermをインストールしておきましょう。
TeraTermは、こちらからダウンロードしてインストールできます。
インストールができたら、TeraTermを起動し、以下の図のようにシリアルポートにさきほど作成したCOM11とCOM12が選択できるようになっているか確認しましょう。
TeraTermのシリアルポートにCOM11とCOM12が表示されていれば、通信相手の準備は完了です。
Pythonのpyserialでシリアル通信する方法
通信相手の準備ができたところで、pyserialでシリアル通信する方法を紹介していきます。
pyserialのインストール
pyserialモジュールは、pipコマンドでインストールできます。
pip install pyserial |
pyserialの使い方
pyserialをインストールできたら、使い方をみていきましょう。
シリアル通信をオープン(Serial)
pyserialでシリアル通信をオープンするには、いくつか宣言が必要です。
1 2 3 4 |
import serial ser = serial.Serial("COM11", 9600) |
最初にpyserialモジュールを使うために「import serial」と宣言してインポートする必要があります。
次にシリアルポートの指定とシリアル通信の速度[bps]を指定します。
このシリアル通信の速度のことを「ボーレート」ということもあるのでおぼえておきましょう。
上記の例では、シリアルポートを”COM11″に指定し、ボーレートに9600[bps]を指定しています。
シリアルデータの書き込み(write)
シリアルデータを送信するためには、writeメソッドを使い、引数に送信したいデータを指定します。
シリアル通信中は、バイナリデータを扱うため、文字列を送りたいときは以下のように b”で囲む必要があります。
1 |
ser.write(b'hello world') |
シリアルデータの読み込み(read/read_line/read_all)
受信したシリアルデータを読み込むためには、pyserialのreadメソッド、read_lineメソッド、read_allメソッドが用意されています。
以下は、read_allメソッドの使用例です。
1 |
result = ser.read_all() |
read_allメソッドで取得したシリアルデータをresult変数に保存しています。
シリアル通信をクローズ(close)
シリアル通信を終了するためには、以下のようにcloseメソッドを使用します。
1 |
ser.close() |
Pythonのpyserialでシリアル通信するサンプルコード
pyserialの使い方がわかったところで、シリアル通信するサンプルコードで動作確認していきましょう。
Pythonでシリアルデータを送信する
Pythonプログラムでシリアルデータを送信、TeraTermでシリアルデータを受信する場合、Python側はCOM11、TeraTerm側はCOM12に割り当てます。
TeraTerm(受信側)の準備
まずは受信側であるTeraTermの準備を行いましょう。
TeraTermを起動し、シリアルポートを「COM12」で開きましょう。
次にTeraTermのメニュー「設定(S)」→「シリアルポート(E)」を選択し、以下の画面でCOM12ポートのスピード(E)項目を「9600」に設定しましょう。
シリアル通信するためには、ボーレートをあわせておかないと、うまく通信できません。
これで受信側の設定は完了で、TeraTermは受信データ待ちの状態になっています。
Pythonプログラム(送信側)の準備
次に送信側のPythonプログラムをみていきましょう。
【Pythonプログラム(シリアルデータ送信)】
1 2 3 4 5 6 7 8 9 |
import serial ser = serial.Serial("COM11", 9600) print(ser.name) ser.write(b'I am Miura') ser.close() |
送信データとして「I am Miura」という文字列をバイトデータとして指定しています。
シリアルデータの送信確認
TeraTermもPythonプログラムも準備ができたところで、Pythonプログラムで送信したデータがTeraTermで受信できるか確認していきましょう。
下図のようにVS CodeとTeraTermを両方みえるようにした上で、VS Code上でPythonプログラムを実行してみましょう。
すると、Pythonプログラムで送信した「I am Miura」というデータが、TeraTerm上で受信できていることが確認できます。
これでPythonのpyserialを使ったシリアルデータの送信が確認できました。
Pythonでシリアルデータを受信
Pythonプログラムでシリアルデータを受信、TeraTermでシリアルデータを送信する場合、Python側はCOM12、TeraTerm側はCOM11に割り当てます。
TeraTerm(送信側)の準備
まず送信側であるTeraTermの準備を行いましょう。
TeraTermを起動し、シリアルポートを「COM11」で開きましょう。
次にTeraTermのシリアルポートのボーレートが「9600」になっていることも確認しておきましょう。
Pythonプログラム(受信側)の準備
次に受信側のPythonプログラムをみていきましょう。
【Pythonプログラム(シリアルデータ受信)】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import serial import time COM="COM12" bitRate=9600 ser = serial.Serial(COM, bitRate, timeout=0.1) while True: time.sleep(0.1) result = ser.read_all() print(result) if result == b'\r': # <Enter>で終了 break print('program end') ser.close() |
上記プログラムは、sleepメソッドで0.1秒ごとにシリアルデータの受信があるか確認した後、受信データをprint文で表示しています。
また、送信側から<Enter>キー(‘\r’)が押されたら、受信処理を終了するプログラムになっています。
シリアルデータの受信確認
シリアルデータの受信を確認するために、まず受信側であるPythonプログラムを実行しましょう。
Pythonプログラムを実行した状態で、TeraTerm上から「This is serial communication test.」という文字列のデータを送信したときの例が下図のようになります。
図のようにVS Code上のターミナルウィンドウで文字列が受信できていることがわかります。
その次にTeraTerm上で<Enter>キーを押して、Pythonプログラムが終了していることも確認できます。
これでPythonのpyserialを使ったシリアルデータの送信が確認できました。
まとめ
いかがでしたでしょうか。
Pythonのpyserialを使ったシリアル通信の使い方と動作確認を行ってきました。
冒頭にもお話したとおり、実際には通信相手の機器を用意して使うため、pyserialは組み込み系のエンジニアの方が多く利用するモジュールだと思います。
私もその一員であるため、同じように組み込み系で利用したいと思っている方のお役に立てたら幸いです。