提供しているソフトウェアのコードは以下のコードとなっております。
# # 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()