|
|
@@ -3,6 +3,10 @@ import serial.tools.list_ports
|
|
|
import threading
|
|
|
import tkinter as tk
|
|
|
from tkinter import ttk, scrolledtext, messagebox
|
|
|
+import os
|
|
|
+
|
|
|
+TEMPLATE_FILE = "templates.txt"
|
|
|
+SRC_FILE = "src_addrs.txt"
|
|
|
|
|
|
class SerialAssistant:
|
|
|
def __init__(self, master):
|
|
|
@@ -58,17 +62,8 @@ class SerialAssistant:
|
|
|
|
|
|
# 命令模板
|
|
|
ttk.Label(frame_tx, text="命令模板:").grid(row=0, column=0, sticky="w")
|
|
|
- self.combo_frame = ttk.Combobox(frame_tx, width=50, state="normal", values=[
|
|
|
- "0A 00 00 00 B4 60 FF EE",
|
|
|
- "08 00 00 00 B4 60 FF EE",
|
|
|
- "03 0A 00 D0 B4 60 FF EE",
|
|
|
- "07 03 00 00 B4 60 FF EE",
|
|
|
- "05 00 00 14 B4 60 FF EE",
|
|
|
- "06 00 00 14 B4 60 FF EE",
|
|
|
- "05 00 00 14 B4 60 FF EE"
|
|
|
- ])
|
|
|
+ self.combo_frame = ttk.Combobox(frame_tx, width=50, state="normal")
|
|
|
self.combo_frame.grid(row=0, column=1, padx=5, sticky="w")
|
|
|
- self.combo_frame.current(0)
|
|
|
|
|
|
frame_template_btn = ttk.Frame(frame_tx)
|
|
|
frame_template_btn.grid(row=0, column=2, padx=5, sticky="w")
|
|
|
@@ -77,9 +72,8 @@ class SerialAssistant:
|
|
|
|
|
|
# ------------------ 源地址 ------------------
|
|
|
ttk.Label(frame_tx, text="源地址(2B):").grid(row=1, column=0, sticky="w")
|
|
|
- self.combo_src = ttk.Combobox(frame_tx, width=10, values=["29 8A", "FF FF", "2A 75"])
|
|
|
+ self.combo_src = ttk.Combobox(frame_tx, width=10)
|
|
|
self.combo_src.grid(row=1, column=1, padx=5, sticky="w")
|
|
|
- self.combo_src.current(0)
|
|
|
|
|
|
ttk.Label(frame_tx, text="新增源地址:").grid(row=2, column=0, sticky="w")
|
|
|
self.entry_new_src = ttk.Entry(frame_tx, width=10)
|
|
|
@@ -97,6 +91,10 @@ class SerialAssistant:
|
|
|
self.status = ttk.Label(master, text="状态: 未连接", relief="sunken", anchor="w")
|
|
|
self.status.grid(row=3, column=0, sticky="ew")
|
|
|
|
|
|
+ # ------------------ 加载永久存储 ------------------
|
|
|
+ self.load_templates()
|
|
|
+ self.load_src_addrs()
|
|
|
+
|
|
|
# ------------------ 串口相关 ------------------
|
|
|
def list_serial_ports(self):
|
|
|
ports = [port.device for port in serial.tools.list_ports.comports()]
|
|
|
@@ -146,6 +144,7 @@ class SerialAssistant:
|
|
|
values.append(addr)
|
|
|
self.combo_src["values"] = values
|
|
|
self.entry_new_src.delete(0, tk.END)
|
|
|
+ self.save_src_file(values)
|
|
|
|
|
|
def delete_src(self):
|
|
|
addr = self.combo_src.get().strip()
|
|
|
@@ -155,6 +154,24 @@ class SerialAssistant:
|
|
|
self.combo_src["values"] = values
|
|
|
if values:
|
|
|
self.combo_src.current(0)
|
|
|
+ self.save_src_file(values)
|
|
|
+
|
|
|
+ def save_src_file(self, values):
|
|
|
+ with open(SRC_FILE, "w") as f:
|
|
|
+ for a in values:
|
|
|
+ f.write(a + "\n")
|
|
|
+
|
|
|
+ def load_src_addrs(self):
|
|
|
+ if os.path.exists(SRC_FILE):
|
|
|
+ with open(SRC_FILE, "r") as f:
|
|
|
+ addrs = [line.strip() for line in f if line.strip()]
|
|
|
+ if addrs:
|
|
|
+ self.combo_src["values"] = addrs
|
|
|
+ self.combo_src.current(0)
|
|
|
+ else:
|
|
|
+ self.combo_src["values"] = []
|
|
|
+ else:
|
|
|
+ self.combo_src["values"] = []
|
|
|
|
|
|
# ------------------ 命令模板管理 ------------------
|
|
|
def save_template(self):
|
|
|
@@ -166,6 +183,7 @@ class SerialAssistant:
|
|
|
if new_template not in values:
|
|
|
values.append(new_template)
|
|
|
self.combo_frame["values"] = values
|
|
|
+ self.save_template_file(values)
|
|
|
messagebox.showinfo("提示", f"模板已保存: {new_template}")
|
|
|
else:
|
|
|
messagebox.showinfo("提示", "模板已存在,无需重复添加")
|
|
|
@@ -180,10 +198,28 @@ class SerialAssistant:
|
|
|
self.combo_frame.current(0)
|
|
|
else:
|
|
|
self.combo_frame.set('')
|
|
|
+ self.save_template_file(values)
|
|
|
messagebox.showinfo("提示", f"模板已删除: {template}")
|
|
|
else:
|
|
|
messagebox.showwarning("提示", "模板不存在或未选择")
|
|
|
|
|
|
+ def save_template_file(self, values):
|
|
|
+ with open(TEMPLATE_FILE, "w") as f:
|
|
|
+ for t in values:
|
|
|
+ f.write(t + "\n")
|
|
|
+
|
|
|
+ def load_templates(self):
|
|
|
+ if os.path.exists(TEMPLATE_FILE):
|
|
|
+ with open(TEMPLATE_FILE, "r") as f:
|
|
|
+ templates = [line.strip() for line in f if line.strip()]
|
|
|
+ if templates:
|
|
|
+ self.combo_frame["values"] = templates
|
|
|
+ self.combo_frame.current(0)
|
|
|
+ else:
|
|
|
+ self.combo_frame["values"] = []
|
|
|
+ else:
|
|
|
+ self.combo_frame["values"] = []
|
|
|
+
|
|
|
# ------------------ 发送帧 ------------------
|
|
|
def send_frame(self):
|
|
|
if not (self.ser and self.ser.is_open):
|