ふくいのサイト

活動

更新日付: 2023/10/19

はじめに

CTIZEN株式会社のCT-S281とPythonを使って日本語を含めたQRコードを印刷するプログラムを提供します。

開発環境

使用言語:Python3.11.6

OS:Windows

コマンドリファレンス

ここからダウウンロードできます。

QRコードの印刷以外はこちらのコマンドリファレンスを見て頑張ってください

ソースコード


import serial
import config
from urllib.parse import quote, urlsplit, urlunsplit
def create_command_buffer(url):
    url_parts = urlsplit(url)
    # クエリ部分をエンコード
    encoded_query = quote(url_parts.query, safe='%0A')
    # エンコードされたURLを再構築
    url = urlunsplit((url_parts.scheme, url_parts.netloc, url_parts.path, encoded_query, url_parts.fragment))
    # 文字数 + 3を計算
    length_byte = len(url) + 3
    length_byte_high = length_byte // 256
    length_byte_low = length_byte % 256
    # Begin the buffer with the initial bytes
    buffer = "金額:{}\n".format(config.amount).encode("shift-jis")
    buffer += bytes([29, 40]) + "k".encode("shift_jis") + bytes([4, 0, 49, 65, 50, 0])
    buffer += bytes([29, 40]) + "k".encode("shift_jis") + bytes([3, 0, 49, 67]) + bytes([4])
    buffer += bytes([29, 40]) + "k".encode("shift_jis") + bytes([3, 0, 49, 69, 51])
    buffer += bytes([29, 40]) + "k".encode("shift_jis") + bytes([length_byte_low, length_byte_high, 49, 80, 48])
    buffer += url.encode("shift_jis")
    buffer += bytes([29, 40]) + "k".encode("shift_jis") + bytes([3, 0, 49, 81, 48]) + bytes([29])
    buffer += "V".encode("shift_jis") + bytes([66, 45])
    return buffer
def send_data_to_printer(url):
    def open_serial_port():
        max_attempts = 3
        for attempt in range(max_attempts):
            try:
                ser = serial.Serial('COM3', 38400, timeout=0.1)
                return ser
            except serial.SerialException as e:
                print(f"Failed to open serial port: {e}")
                if attempt < max_attempts - 1:
                    print(f"Retrying in 1 second...")
        raise Exception(f"Failed to open serial port after {max_attempts} attempts.")
    data_to_send = create_command_buffer(url)
    try:
        ser = open_serial_port()
        ser.write(data_to_send)
    except serial.SerialException as e:
        print(f"Error while sending data: {e}")
    finally:
        if ser and ser.is_open:
            ser.close()
            print("Serial port closed.")            
📋

出力結果

このプログラムを実行すると、指定されたURLがエンコードされてプリンタに送信されます。

コードの注意点、解説

このコードはシリアル通信を利用してデータを送信するため、適切なCOMポートを指定する必要があります。デバイスマネージャーやteratermから繋がっているポートを確認してください。

日本語をそのままURLに記述してもQRコードは印刷されません。また、改行を入れたい場合には\nを使っても適切に印刷されません。%0AといったURLエンコードされた改行文字を埋め込んでいます。

以下のコードの部分で、日本語をエンコードしています。改行文字は既にURLエンコードされている状態なので除外しています。


url_parts = urlsplit(url)
# クエリ部分をエンコード
encoded_query = quote(url_parts.query, safe='%0A')
# エンコードされたURLを再構築
url = urlunsplit((url_parts.scheme, url_parts.netloc, url_parts.path, encoded_query, url_parts.fragment))
📋