Bläddra i källkod

添加文件导入。设备地址,命令模板

xuxinyi 1 månad sedan
förälder
incheckning
e4a2b884d8
2 ändrade filer med 81 tillägg och 35 borttagningar
  1. 33 23
      .idea/workspace.xml
  2. 48 12
      main.py

+ 33 - 23
.idea/workspace.xml

@@ -4,7 +4,7 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="1ac4e985-6885-47ec-89fe-c34ac50172a1" name="更改" comment="生成exe命令">
+    <list default="true" id="1ac4e985-6885-47ec-89fe-c34ac50172a1" name="更改" comment="命令版可以修改。">
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
     </list>
@@ -16,30 +16,30 @@
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
-  <component name="ProjectColorInfo"><![CDATA[{
-  "associatedIndex": 6
-}]]></component>
+  <component name="ProjectColorInfo">{
+  &quot;associatedIndex&quot;: 6
+}</component>
   <component name="ProjectId" id="33rEEdjTBkzEtv8LsqcH1MQFlHv" />
   <component name="ProjectViewState">
     <option name="hideEmptyMiddlePackages" value="true" />
     <option name="showLibraryContents" value="true" />
   </component>
-  <component name="PropertiesComponent"><![CDATA[{
-  "keyToString": {
-    "ModuleVcsDetector.initialDetectionPerformed": "true",
-    "Python.main.executor": "Run",
-    "RunOnceActivity.ShowReadmeOnStart": "true",
-    "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
-    "RunOnceActivity.git.unshallow": "true",
-    "git-widget-placeholder": "master",
-    "node.js.detected.package.eslint": "true",
-    "node.js.detected.package.tslint": "true",
-    "node.js.selected.package.eslint": "(autodetect)",
-    "node.js.selected.package.tslint": "(autodetect)",
-    "nodejs_package_manager_path": "npm",
-    "vue.rearranger.settings.migration": "true"
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
+    &quot;Python.main.executor&quot;: &quot;Run&quot;,
+    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
+    &quot;git-widget-placeholder&quot;: &quot;master&quot;,
+    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
+    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
+    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
+    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
+    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
+    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
   }
-}]]></component>
+}</component>
   <component name="SharedIndexes">
     <attachedChunks>
       <set>
@@ -55,7 +55,8 @@
       <option name="number" value="Default" />
       <option name="presentableId" value="Default" />
       <updated>1760066680854</updated>
-      <workItem from="1760066681868" duration="5887000" />
+      <workItem from="1760066681868" duration="6034000" />
+      <workItem from="1760079175256" duration="328000" />
     </task>
     <task id="LOCAL-00001" summary="first commit">
       <option name="closed" value="true" />
@@ -89,7 +90,15 @@
       <option name="project" value="LOCAL" />
       <updated>1760077535646</updated>
     </task>
-    <option name="localTasksCounter" value="5" />
+    <task id="LOCAL-00005" summary="命令版可以修改。">
+      <option name="closed" value="true" />
+      <created>1760079064396</created>
+      <option name="number" value="00005" />
+      <option name="presentableId" value="LOCAL-00005" />
+      <option name="project" value="LOCAL" />
+      <updated>1760079064396</updated>
+    </task>
+    <option name="localTasksCounter" value="6" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -111,9 +120,10 @@
     <MESSAGE value="初步实现串口助手" />
     <MESSAGE value="实现手动发送命令的串口助手" />
     <MESSAGE value="生成exe命令" />
-    <option name="LAST_COMMIT_MESSAGE" value="生成exe命令" />
+    <MESSAGE value="命令版可以修改。" />
+    <option name="LAST_COMMIT_MESSAGE" value="命令版可以修改。" />
   </component>
   <component name="com.intellij.coverage.CoverageDataManagerImpl">
-    <SUITE FILE_PATH="coverage/bl_lora_manager$main.coverage" NAME="main 覆盖结果" MODIFIED="1760078693666" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
+    <SUITE FILE_PATH="coverage/bl_lora_manager$main.coverage" NAME="main 覆盖结果" MODIFIED="1760079595200" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
   </component>
 </project>

+ 48 - 12
main.py

@@ -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):