TSZCサンプルコード Python版
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()