diff --git a/DLPilot/src/app_gui.py b/DLPilot/src/app_gui.py index 3a67935..7145ca3 100644 --- a/DLPilot/src/app_gui.py +++ b/DLPilot/src/app_gui.py @@ -878,7 +878,17 @@ class App(ctk.CTk): self._pd_timer = self.after(3000, lambda: self._pd_step_done(False, '超时')) def _pd_on_reply(self, line): - self._pd_step_done(line.startswith('← ok'), line) + self._pd_step_done(self._pd_reply_ok(line), line) + + @staticmethod + def _pd_reply_ok(line): + """应答行 -> 是否成功帧(TYPE=0xF0): 成功行正文是 payload 原文(如 'PD'/'okTL:246', + 不必有 ok 前缀), 失败行正文是 TYPE 译码词或带 err:, 据此区分""" + body = line[2:].split(' [')[0].strip() + if 'err:' in body: + return False + return not any(n in body for n in dlpc_rs485.TYPE_NAMES.values() + if n != '成功') # '成功' 不会出现在日志正文, 仅防 payload 撞词 def _pd_step_done(self, ok, line=''): if not self._pd_seq: @@ -889,8 +899,9 @@ class App(ctk.CTk): _cmd, kind = self._pd_seq.pop(0) payload = '' if ok: - payload = line[2:].split(' [')[0].strip() # 去 '← ' 与尾部 hex - payload = payload[2:].strip() if payload[:2].lower() == 'ok' else '' + body = line[2:].split(' [')[0].strip() # 去 '← ' 与尾部 hex + payload = '' if body.lower() == 'ok' else \ + (body[2:].strip() if body[:2].lower() == 'ok' else body) if kind == 'pd': self.chip_pd.configure(fg_color=CHIP_OK if ok else CHIP_ERR, text_color='#FFFFFF',