Pythonのサンプルコード

提供しているソフトウェアのコードは以下のコードとなっております。

#
#    Copyright (C)2020 TESBIT co.,ltd. All rights reserved.
#    

import tkinter as tk
import serial
import threading
import time
from tkinter import messagebox


#グローバル変数========================================================
comf_conn = 0 # 接続管理フラグ
comf_disconn = 0 # 切断管理フラグ
tf = 1 # スレッドフラグ(Thread Flag)

comf_init = 0 # 初期化管理フラグ
comf_read_a = 0 # read_a管理フラグ

comf_move_z = 0 # ズーム移動管理フラグ
comf_move_f = 0 # フォーカス移動管理フラグ
comf_move_i = 0 # アイリス移動管理フラグ
comf_read_z = 0 # ズーム値読込管理フラグ
comf_read_f = 0 # フォーカス値読込管理フラグ
comf_read_i = 0 # アイリス値読込管理フラグ


# 画面設定
root = tk.Tk()
root.geometry('250x110') # 画面サイズ
root.title('シリアル通信') # 画面タイトル

var = tk.StringVar() # 初期化ステータス表示ラベルの変数


# ボタンのクリックイベント
def btn_ZoomSet_click(): # ズームsetボタン
    print('move_z')
    global comf_move_z # 使うところでグローバル宣言
    comf_move_z = 1 # 実際に使う

def btn_ZoomRead_click(): # ズームreadボタン
    print('read_z')
    global comf_read_z
    comf_read_z = 1

def btn_FocusSet_click(): # フォーカスsetボタン
    print('move_f')
    global comf_move_f
    comf_move_f = 1
    
def btn_FocusRead_click(): # フォーカスreadボタン
    print('read_f')
    global comf_read_f
    comf_read_f = 1
    
def btn_IrisSet_click(): # アイリスsetボタン
    print('move_i')
    global comf_move_i
    comf_move_i = 1

def btn_IrisRead_click(): # アイリスreadボタン
    print('read_i')
    global comf_read_i
    comf_read_i = 1

def btn_conn_click(): # 接続ボタン
    print('接続')
    global comf_conn
    comf_conn = 1

def btn_disconn_click(): # 切断ボタン
    print('切断')
    global comf_disconn
    comf_disconn = 1

def btn_init_click(): # 初期化ボタン
    print('初期化')
    global comf_init
    comf_init = 1


# ラベルの配置
lb_Zoom = tk.Label(text = 'Zoom')
lb_Zoom.grid(row=0,column=0)
lb_Focus = tk.Label(text = 'Focus')
lb_Focus.grid(row=1,column=0)
lb_Iris = tk.Label(text = 'Iris')
lb_Iris.grid(row=2,column=0)

# テキストボックスの配置
tb_Zoom = tk.Entry(width=20)
tb_Zoom.grid(row=0,column=1)
tb_Focus = tk.Entry(width=20)
tb_Focus.grid(row=1,column=1)
tb_Iris = tk.Entry(width=20)
tb_Iris.grid(row=2,column=1)


# ボタンの配置
btn_ZoomSet = tk.Button(text = 'set', command = btn_ZoomSet_click)
btn_ZoomRead = tk.Button(text = 'read', command = btn_ZoomRead_click)
btn_ZoomSet.grid(row=0,column=2)
btn_ZoomRead.grid(row=0,column=3)
btn_FocusSet = tk.Button(text = 'set', command = btn_FocusSet_click)
btn_FocusRead = tk.Button(text = 'read', command = btn_FocusRead_click)
btn_FocusSet.grid(row=1,column=2)
btn_FocusRead.grid(row=1,column=3)
btn_IrisSet = tk.Button(text = 'set', command = btn_IrisSet_click)
btn_IrisRead = tk.Button(text = 'read', command = btn_IrisRead_click)
btn_IrisSet.grid(row=2,column=2)
btn_IrisRead.grid(row=2,column=3)

# init関係
btn_init = tk.Button(text = '初期化', command = btn_init_click)
btn_init.grid(row=3,column=0)
var.set("") # 初期化ステータスを空欄にする
lb_init = tk.Label(textvariable=var)
lb_init.grid(row=3,column=1)

btn_conn = tk.Button(text = '接続', command = btn_conn_click)
btn_disconn = tk.Button(text = '切断', command=btn_disconn_click)
btn_conn.grid(row=3,column=2)
btn_disconn.grid(row=3,column=3)



# シリアル通信系のコード(スレッド)====================================
comf_receive = 0 # 結果を受信しに行っていいか判断するフラグ

def commCTR():
    # シリアル通信の設定
    comm = serial.Serial()
    comm.baudrate = 38400 # ボーレート
    comm.parity = serial.PARITY_NONE
    comm.bytesize = serial.EIGHTBITS
    comm.stopbits = serial.STOPBITS_ONE
    comm.timeout = 5 #sec
    comm.port = 'COM7' # TSZC-06を接続しているCOMポート

    #グローバル変数の呼び出し
    global tf
    tf = 1 # tf=1のあいだスレッド内のループが実行される
    global comf_conn
    global comf_disconn
    global comf_init
    global comf_move_z
    global comf_move_f
    global comf_move_i
    global comf_read_z
    global comf_read_f
    global comf_read_i

    global comf_receive
    global comf_read_a
    global var

    # シリアル通信ループ
    while tf:
        if comf_conn == 1: #フラグONのときの動作
            comf_conn = 0 #フラグOFFに戻す
            print("接続命令受信")

            if(comm.isOpen() == False):
                print('connect')
                comm.open() # COMポート開く
                comf_receive = 1 #受信ON
            else:
                print('opened')
        
        if comf_disconn == 1:
            comf_disconn = 0
            print("切断命令受信")
            comm.close() # COMポート閉じる
            comf_receive = 0 #受信OFF

        # init
        if comf_init == 1:
            comf_init = 0
            print("初期化命令受信")
            comm.reset_input_buffer() # ノイズデータがある場合があるのでバッファをクリアする
            # zoomの値をシリアル通信
            send_string = 'init_a'
            print(send_string)
            var.set("初期化中")
            comm.write(send_string.encode())
            #ボタン無効化
            btn_ZoomSet.config(state="disable")
            btn_ZoomRead.config(state="disable")
            btn_FocusSet.config(state="disable")
            btn_FocusRead.config(state="disable")
            btn_IrisSet.config(state="disable")
            btn_IrisRead.config(state="disable")
            btn_init.config(state="disable")
            btn_conn.config(state="disable")
            btn_disconn.config(state="disable")

        # read_a
        if comf_read_a ==1:
            comf_read_a = 0
            print("read_a実行")
            comm.reset_input_buffer()
            send_string = 'read_a'
            print(send_string)
            comm.write(send_string.encode())

        #zoomのsetボタンが押された後
        if comf_move_z == 1:
            comf_move_z = 0
            print("comf_move_z")
            # テキスト取得
            comm.reset_input_buffer()
            num = int(tb_Zoom.get())
            # zoomの値をシリアル通信
            send_string = 'move_z,' + str(num)
            print(send_string)
            comm.write(send_string.encode())

        #zoomのreadボタンが押された後
        if comf_read_z == 1:
            comf_read_z = 0
            print("comf_read_z")
            tb_Zoom.delete(0,tk.END) # テキストボックスの初期化
            comm.reset_input_buffer()
            # read_zoom命令をシリアル通信
            send_string = 'read_z'
            comm.write(send_string.encode())

        #focusのsetボタンが押された後
        if comf_move_f == 1:
            comf_move_f = 0
            print("comf_move_f")
            # テキスト取得
            comm.reset_input_buffer()
            num = int(tb_Focus.get())
            # focusの値をシリアル通信
            send_string = 'move_f,' + str(num)
            print(send_string)
            comm.write(send_string.encode())

        #focusのreadボタンが押された後
        if comf_read_f == 1:
            comf_read_f = 0
            print("comf_read_f")
            tb_Focus.delete(0,tk.END) # テキストボックスの初期化
            comm.reset_input_buffer()
            # read_iris命令をシリアル通信
            send_string = 'read_f'
            comm.write(send_string.encode())

        #irisのsetボタンが押された後
        if comf_move_i == 1:
            comf_move_i = 0
            print("comf_move_i")
            # テキスト取得
            comm.reset_input_buffer()
            num = int(tb_Iris.get())
            # irisの値をシリアル通信
            send_string = 'move_i,' + str(num)
            print(send_string)
            comm.write(send_string.encode())

        #irisのreadボタンが押された後
        if comf_read_i == 1:
            comf_read_i = 0
            print("comf_read_i")
            tb_Iris.delete(0,tk.END) # テキストボックスの初期化
            comm.reset_input_buffer()
            # read_iris命令をシリアル通信
            send_string = 'read_i'
            comm.write(send_string.encode())

        # 毎回受信する
        # readlineした結果に応じて動作を切り替える
        # read_z,read_f,read_iを含む文字列があるか調べる
        # init_aを送ったら終了時にinit_a_doneが返ってくる

        #comf_receiveが1になっているとき(毎回受信ON)
        if comf_receive == 1:
            # コマンドを送った結果を受信
            recv_string = comm.readline()
            recv_string = recv_string.decode()
            recv_list = []
            recv_list = recv_string.split(',')
            # リストの中にread_z,read_f,read_iが含まれるか
            if 'read_z' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                tb_Zoom.delete(0,tk.END)
                tb_Zoom.insert(0, recv_list[1])
            elif 'read_f' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                tb_Focus.delete(0,tk.END)
                tb_Focus.insert(0, recv_list[1])
            elif 'read_i' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                tb_Iris.delete(0,tk.END)
                tb_Iris.insert(0, recv_list[1])
            # 'read_a'のとき
            elif 'read_a' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                tb_Zoom.delete(0,tk.END)
                tb_Zoom.insert(0, recv_list[1])
                tb_Focus.delete(0,tk.END)
                tb_Focus.insert(0, recv_list[2])
                tb_Iris.delete(0,tk.END)
                tb_Iris.insert(0, recv_list[3])
            # 'init_a'のとき
            elif 'init_a_done' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                var.set("")
                messagebox.showinfo("メッセージ", "初期化が完了しました")
                #ボタン有効化
                btn_ZoomSet.config(state="normal")
                btn_ZoomRead.config(state="normal")
                btn_FocusSet.config(state="normal")
                btn_FocusRead.config(state="normal")
                btn_IrisSet.config(state="normal")
                btn_IrisRead.config(state="normal")
                btn_init.config(state="normal")
                btn_conn.config(state="normal")
                btn_disconn.config(state="normal")
                comf_read_a = 1
            # move後のread
            elif 'move_z;' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                comf_read_z = 1
            elif 'move_f;' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                comf_read_f = 1
            elif 'move_i;' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                comf_read_i = 1
            # 接続直後のread_a
            elif 'ZLC TESBIT TSZC-06' in recv_list[0]:
                print("コマンド結果受信",recv_string)
                comf_read_a = 1

            else :
                time.sleep(0.2)

        time.sleep(0.2)


# スレッド開始==========================================================
threadComm = threading.Thread(target=commCTR)
threadComm.start()
threadComm.join
print("スレッド起動完了")

# 閉じるボタン
def on_closing():
    global tf
    tf = 0
    root.destroy()

root.protocol("WM_DELETE_WINDOW", on_closing)

# 画面表示
root.mainloop()