From 1f686658606433c1f609a6a5a626a53b5dc3e842 Mon Sep 17 00:00:00 2001 From: hulk Date: Fri, 18 Sep 2026 01:08:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(DLPilot):=20=E4=B8=B2=E5=8F=A3=E5=8D=A1?= =?UTF-8?q?=E6=AD=BB=E4=B8=8E=E5=BA=8F=E5=88=97=E4=BA=92=E7=9B=B8=E5=B9=B2?= =?UTF-8?q?=E6=89=B0=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DLPilot/src/app_gui.py | 21 +++++++++++++++++++++ DLPilot/src/dlpc_rs485.py | 4 +++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/DLPilot/src/app_gui.py b/DLPilot/src/app_gui.py index 2c93ee3..49b8980 100644 --- a/DLPilot/src/app_gui.py +++ b/DLPilot/src/app_gui.py @@ -771,6 +771,8 @@ class App(ctk.CTk): else: color = 'gray60' self.lbl_dlpc_st.configure(text=text, text_color=color) + if text.startswith(('已断开', '串口丢失')): + self._serial_reset_state() elif kind == 'temp': if text.startswith('DMD'): self.var_dmd.set(text) @@ -829,6 +831,7 @@ class App(ctk.CTk): def _dlpc_toggle(self): if self.dlpc.is_connected(): self.dlpc.close() + self._serial_reset_state() # 断开时清序列/定时器/应答归位, 防旧账错配 return port = self._dlpc_selected_port() if not port: @@ -847,10 +850,28 @@ class App(ctk.CTk): config.save_slots(self.slots, self.area_var.get()) # 记住本次串口 self.dlpc.open(port, baud, bytesize=bytesize, parity=parity, stopbits=stopbits) + def _serial_reset_state(self): + """断开/失连时清理进行中的序列与应答归位队列(不碰串口线程本身)""" + self._pd_seq.clear() + self._pwr_seq.clear() + for t in (self._pd_timer, self._pwr_timer): + if t: + try: + self.after_cancel(t) + except Exception: + pass + self._pd_timer = self._pwr_timer = None + self._tl_order.clear() + def _dlpc_send(self, cmd): if not self.dlpc.is_connected(): self.lbl_dlpc_st.configure(text='未连接串口', text_color='#E07A3F') return + if self._pd_seq or self._pwr_seq: + # 序列进行中: 手动命令的应答帧会被序列错认领(它不区分应答属于哪条 + # 命令, 来一帧消费一步), 值会错位 —— 拒绝并提示, 序列结束再发 + self._dlpc_log(f'序列进行中, 命令已忽略: {cmd}') + return self.dlpc.send(cmd) def _dlpc_send_preset(self): diff --git a/DLPilot/src/dlpc_rs485.py b/DLPilot/src/dlpc_rs485.py index 2d7c689..72fe4d1 100644 --- a/DLPilot/src/dlpc_rs485.py +++ b/DLPilot/src/dlpc_rs485.py @@ -290,7 +290,9 @@ class DLPC485: port, baud, bytesize=bytesizes.get(dbsize, serial.EIGHTBITS), parity=parities.get(parity, serial.PARITY_NONE), stopbits=stopbits.get(sbits, serial.STOPBITS_ONE), - timeout=0.15) + timeout=0.15, + write_timeout=1.0) # 写超时: 转换器停滞时 write 会 + # 永久阻塞并卡死线程, 必须设上限 self.parser = FrameParser() self._open_key = target self.on_status(f'已连接 {port} @ {baud} '