# Debug Session: stop-reset-control - **Status**: [OPEN] - **Issue**: 点击停止后设备仍继续计数;清零按钮通常需要点两下才生效。 - **Debug Server**: http://127.0.0.1:7777/event - **Log File**: .dbg/trae-debug-log-stop-reset-control.ndjson ## Reproduction Steps 1. 进入比赛页,确认串口连接到真实网关串口。 2. 下载本场并点击开始。 3. 等待 2-3 秒后点击“停止”,观察设备是否继续计数。 4. 再点击“清零”,观察是否需要点两下才能生效。 ## Hypotheses & Verification | ID | Hypothesis | Likelihood | Effort | Evidence | |----|------------|------------|--------|----------| | A | 停止命令已发出,但设备随后持续上报运行态数据,导致现场看起来“仍未停计” | High | Med | Pending | | B | 清零第一次点击时,命令发送成功但设备尚未完成状态切换,第二次点击才落入稳定时机 | High | Med | Pending | | C | 停止/清零的前后顺序或帧间延时与旧 WinForms 不一致,导致设备未按预期处理 | High | Med | Pending | | D | 后端在按钮操作后立即广播了本地状态,但稍后设备快照又把模式/计数覆盖回页面 | Med | Med | Pending | ## Log Evidence - 预修复日志确认停止链路已进入后端: - `CompetitionSessionService.StopAsync` 进入,日志时间 `1781076318182` - 随后 `SerialGateway.SendAsync` 发出 `5530000000000000000000AA`,日志时间 `1781076318183` - 约 215ms 后,`CompetitionSessionService.StopAsync` 已把会话切到 `IsTesting=false`,日志时间 `1781076318398` - 但停止后设备仍持续回传运行态: - 在 `1781076318433` 之后仍持续出现 `device snapshot observed` - 快照里 `snapshot.Mode=2`,且第二个设备从 `Counter=64` 继续增长到 `Counter=66` - 说明“停止按钮无效”不是接口没调到,也不是串口没发,而是设备没有稳定进入停止态 - 清零链路同样已进入后端: - `CompetitionSessionService.ResetCurrentRoundAsync` 进入,日志时间 `1781076319542` - 同时 `SerialGateway.SendAsync` 发出 `550A0A0000000000000000AA` - 本地状态已在 `1781076319543` 被清为 `Count=0 / Mode=0` - 但清零前一刻设备仍停留在运行态: - `reset button entered` 时当前场次仍能看到 `participant.Mode=2` - 清零后紧接着又收到 `snapshot.Mode=2` - 说明第一次清零经常发生在设备尚未真正停稳的窗口内 - 旧版 WinForms 对照结论: - 单独停止按钮会先把本地 `Mode` 置为 `0`,再发送 `0x30` - 下载完成收尾流程是先 `0x30` 再 `0x0A` - 当前后端停止时没有同步把当前场次参与者 `Mode` 置回 `0`,清零也没有先补一次停止 ## Verification Conclusion - A confirmed:停止命令已发出,但设备随后继续回传运行态数据。 - B confirmed:清零第一次点击常落在设备未停稳的窗口里,因此体感上需要第二次。 - C confirmed:当前停止/清零时序与旧版关键细节仍有差异,至少缺少“停止后本地模式归零”和“清零前先停”的收尾动作。 - D partially confirmed:后端不会在停止后继续写分,但停止广播中的 `participant.Mode` 仍保留旧值,页面会继续显示运行态颜色。 - 最小修复方向: - 停止命令改为更稳妥的双发 `0x30` - 手动停止时立即把当前场次参与者 `Mode` 归零 - 清零前先补一次停止,再发送 `0x0A`