業務システムを作っていると、バーコードリーダーで読み取った値をそのままプログラムで処理したい場面があります。本記事では、Pythonのpyserialを使って、シリアル接続したバーコードリーダーの読み取り値を受信する一番シンプルな方法を紹介します。
バーコードリーダーの読み取り値、フォーカス位置に振り回されていませんか?
多くのバーコードリーダーは、キーボードと同じようにカーソル位置へ文字を入力する「キーボードエミュレーション(HID)」で動作します。手軽な一方で、入力先のフォーカスがずれていると、まったく別の場所に値が入ってしまう…という経験はないでしょうか。
シリアル接続なら「画面に関係なく」確実に受け取れる
リーダーの設定をRS-232C/シリアル(仮想COMポート)モードに切り替えると、読み取った文字列をCOMポート経由で受け取れます。画面のフォーカス位置に左右されず、プログラム側で確実に読み取り値だけを受信できるので、業務処理に組み込みやすくなります。
本記事では、シリアル接続したバーコードリーダーの値をひたすら受信して表示するだけの、シンプルな例を紹介します。COMポート番号やボーレートはソースコードに直接書いていますので、お使いの環境に合わせて変更してください。
コピペで動く!バーコード読み取りサンプルコード
さっそくサンプルコードを紹介します。
# pip install pyserial
# serial: シリアル通信(COMポート)を行うためのライブラリ。
import serial
# ===== 接続設定(お使いの環境に合わせて変更してください)=====
COM_PORT = 'COM3' # バーコードリーダーが接続されているCOMポート
BAUD_RATE = 9600 # ボーレート(リーダー本体の設定と合わせる)
TIMEOUT = 0.1 # 読み取りのタイムアウト(秒)
def main():
"""
シリアル接続のバーコードリーダーから読み取り値を受信して表示する関数。
バーコードを読み取ると、リーダーは末尾に終端コード(CRやLF)を付けて
文字列を送ってくるので、終端コードが来たタイミングで1件として確定します。
"""
# シリアルポートをオープン
ser = serial.Serial(COM_PORT, BAUD_RATE, timeout=TIMEOUT)
print(f'{COM_PORT} を {BAUD_RATE}bps でオープンしました。')
print('バーコードを読み取ってください。(Ctrl+Cで終了)')
buffer = '' # 受信した文字を溜めておくバッファ
try:
while True:
# 1バイト受信(TIMEOUT秒受信が無ければ空のバイトが返る)
data = ser.read()
if not data:
continue
# バイトを文字へデコード(不正なバイトは無視)
char = data.decode('utf-8', errors='ignore')
# 終端コード(CR or LF)が来たら1件のバーコードとして確定
if char in ('\r', '\n'):
if buffer:
print('読み取り:', buffer)
buffer = '' # 次の読み取りに備えてバッファをクリア
else:
# 終端コード以外は読み取り値としてバッファに追加
buffer += char
except KeyboardInterrupt:
# Ctrl+Cで終了
print('終了します。')
finally:
# 必ずポートを閉じる
ser.close()
if __name__ == '__main__':
main()
事前準備として、シリアル通信を行うpyserialを使用しています。
動かす前の事前準備
以下のコマンドでpyserialをインストールしてください。
pip install pyserialまた、バーコードリーダー本体の通信設定(COMポートモード・ボーレート)と、サンプルコードのCOM_PORT/BAUD_RATEを必ず一致させてください。 ボーレートが合っていないと文字化けして正しく読み取れません。COMポート番号はWindowsの「デバイスマネージャー」→「ポート(COM と LPT)」で確認できます。
実行結果|読み取った値が次々と表示される
プログラムを実行すると、まず接続状態が表示され、読み取り待ちになります。
COM3 を 9600bps でオープンしました。
バーコードを読み取ってください。(Ctrl+Cで終了)この状態でバーコードを読み取ると、値が次々と表示されます。
読み取り: 4901234567894
読み取り: ABC-0001Ctrl + Cを押すと「終了します。」と表示され、ポートを閉じて終了します。
最後に、読み取った値は業務処理に“そのまま”使える
以上が、Pythonのpyserialを使って、シリアル接続のバーコードリーダーから値を受信する方法です。
今回は「読み取って表示するだけ」のシンプルな例ですが、printの部分を書き換えれば、読み取った値で在庫検索したり、CSVやデータベースへ登録したりと、業務処理に簡単に組み込めます。フォーカスを気にせず確実にデータを受け取れるので、興味のある方はぜひ試してみてください。


コメント