この記事はこんな人におすすめ
・装置とシリアル通信するプログラムを知りたい方
PySerialはPythonでシリアル通信を行うためのライブラリであり、Windows、Linux、macOSなどの様々なプラットフォームで利用することができます。
本記事では、PySerialの基本的な使い方やシリアル通信する際に使い勝手が良くなるコードについて、Pythonのサンプルコードを交えながら解説します。
PySeiralの基本
PCへのインストール方法
PySerialはpipコマンドを使用してインストールすることができます。
以下のコマンドを実行して、PySerialをインストールします。
pip install pyserial
シリアルポートのオープン
PySerialを使用してシリアルポートをオープンするには、serialモジュールのSerial()関数を使用します。Serial()関数は、以下のような引数を受け取ります。
- port:シリアルポートの名称
- baudrate:通信速度
- bytesize:データビット数
- parity:パリティ
- stopbits:ストップビット数
- timeout:タイムアウト時間
- writeTimeout:書き込みタイムアウト時間
- xonxoff:XON/XOFFフロー制御
- rtscts:RTS/CTSフロー制御
- dsrdtr:DSR/DTRフロー制御
以下は、COM3ポートに接続されたデバイスとの通信を開始する例です。
import serial
ser = serial.Serial('COM3', 9600, timeout=1)
上記の例では、COM3ポートに接続されたデバイスと、9600bpsの通信速度で通信を開始しています。
timeout引数は、データの受信待機時間を設定するために使用されます。
ここでは、1秒間データを受信しなかった場合にタイムアウトするように設定しています。
シリアルポートのクローズ
シリアルポートを使用し終わったら、必ずクローズする必要があります。
クローズしない場合、シリアルポートがロックされたままになり、他のプログラムからアクセスできなくなることがあります。
import serial
ser = serial.Serial('COM3', 9600, timeout=1)
#クローズ
ser.close()
データの送信
シリアルポートをオープンしたら、データを送信することができます。
Serial()関数でオープンしたシリアルポートオブジェクトに対して、write()メソッドを使用してデータを送信することができます。
以下は、文字列を送信する例です。
import serial
ser = serial.Serial('COM3', 9600, timeout=1)
data = 'Hello, World!'
ser.write(data.encode())
ser.close()
上記の例では、文字列”Hello, World!”をシリアルポートに送信しています。
send()メソッドでデータを送信する前に、文字列をバイト列に変換する必要があります。
ここでは、encode()メソッドを使用して、文字列をUTF-8エンコードされたバイト列に変換しています。
データの受信
シリアルポートをオープンしたら、データを受信することができます。
Serial()関数でオープンしたシリアルポートオブジェクトに対して、read()メソッドを使用してデータを受信することができます。
以下は、受信したデータを文字列として表示する例です。
import serial
ser = serial.Serial('COM3', 9600, timeout=1)
data = ser.read(10)
print(data.decode())
ser.close()
上記の例では、最大10バイトのデータを受信して、受信したデータを文字列として表示しています。
PySerialを使ったシリアル通信のコード例
ここからは、PySerialを使ったシリアル通信の実装コード例を紹介したいと思います。
シリアルポートの自動検知プログラム
import serial
import serial.tools.list_ports
# シリアルポートを自動検出する関数
def auto_detect_serial_port():
ports = list(serial.tools.list_ports.comports())
for p in ports:
print(p)
if 'USB Serial Port' in p.description:
return p.device
return None
# シリアルポートをオープンする
ser = serial.Serial(auto_detect_serial_port(), 9600, timeout=1)
# ここでシリアル通信を行う
# シリアルポートをクローズする
ser.close()
上記の例では、serial.tools.list_portsモジュールを使用して、接続されたシリアルポートを自動的に検出しています。
description属性に”USB Serial Port”が含まれるシリアルポートが見つかった場合、そのシリアルポートを使用して通信を開始します。
バッファリングされたシリアル通信プログラム
以下は、PySerialを使用して、バッファリングされたシリアル通信プログラムの例です。
このプログラムでは、受信したデータをバッファに蓄積してから、一定のデータ量が溜まったらまとめて処理する方法を取っています。
import serial
ser = serial.Serial('COM3', 9600, timeout=1)
# データを受信する関数
def read_data():
buffer = b''
while True:
data = ser.read(1024)
buffer += data
if len(buffer) >= 1024:
return buffer
# ここでシリアル通信を行う
# データを送信する
ser.write(b'Hello, World!')
# データを受信する
data = read_data()
print(data.decode())
# シリアルポートをクローズする
ser.close()
上記の例では、1024バイトのデータを受信するために、read_data()関数を定義しています。
受信したデータをバッファに蓄積し、バッファのサイズが1024バイトに達したら、受信を終了してバッファを返します。
まとめ
以上が、PySerialを使用したシリアル通信の基本的な使い方やコード例です。
PySerialは、シリアル通信をより簡単に扱うことができる便利なライブラリです。
シリアル通信を行う際は、PySerialを使用することで、よりスムーズな開発を行うことができます。
おわりに
どうもこんにちは。コンです。
ここまで読んでいただき、誠にありがとうございます。
もうすぐ2022年度も終わりますが、皆様いかがお過ごしでしょうか。
私はいつものように大量の検収処理があるのですがそれに加えて、新入社員の教育準備に追われております。
実は私は大学を卒業して、会社に入社するという経験をしていないため
新入社員という経験をしたことがありません。
そのため新入社員教育も受けて無いので、教育する側として大丈夫なのだろうかと不安な日々を過ごしております。
そんな少しナーバスな日々ですが
GWには大学時代の友人たちとの旅行を予定しているので、それまでは頑張っていきますよ。
それでは。