更新日付: 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))