diff --git a/docs/产品需求/产品需求设计文档.md b/docs/产品需求/产品需求设计文档.md index 2dfa0a11..f825db27 100644 --- a/docs/产品需求/产品需求设计文档.md +++ b/docs/产品需求/产品需求设计文档.md @@ -840,7 +840,7 @@ CRC-16/MODBUS(多项式 `0xA001` 反转式、初值 `0xFFFF`、查表法), > ⚠ **帧长以代码为准:4208 B**(屏板 readme 与 `BMP_LEN` 写的"3208 字节"不作准):接收侧实参是 > `Check_CRC(DR, UART_RX_LEN)`,`UART_RX_LEN = 4208` → CRC 取 `DR[4206]/DR[4207]`、覆盖 `DR[0..4205]`。 > 有效载荷只有前 3208 B,其后 998 B 为凑齐 CRC 窗口的填充;**主机只发 3210 B 时屏板会在 -> `DR[4206]` 读到陈旧字节,CRC 必失败并静默丢弃**。**已台架与真屏板实测固化**(屏板出图 = 端到端证据,`docs/子系统设计/屏板链路设计.md` §9.1)。 +> `DR[4206]` 读到陈旧字节,CRC 必失败并静默丢弃**。**已台架与真屏板实测固化**(屏板出图 = 端到端证据,见 `docs/子系统设计/屏板链路设计.md` §4)。 > ⚠ **应答帧不是合法 Modbus RTU 响应**:没有地址、没有功能码、没有字节数域,是一段裸二进制块。 > 因此**不能套用现成 Modbus 从站栈**,只能按上表手工组帧。 diff --git a/docs/产品需求/参考产品复刻明细.md b/docs/产品需求/参考产品复刻明细.md index ccc29049..8c00c658 100644 --- a/docs/产品需求/参考产品复刻明细.md +++ b/docs/产品需求/参考产品复刻明细.md @@ -788,7 +788,7 @@ tTimer_NoUI 无压无流判据(CN_ > > **第三批状态**:串口通道(第 10~14、16 条)主机侧已实现并经台架与真屏板验收,屏板实物已上台架; > 帧长**已固化 4208 B**(代码实参为准,屏板 readme 的 3208 B 不作数——真屏板出图为端到端证据)。 -> 未闭环项(2 h 长稳、仪器项等)见 `docs/子系统设计/屏板链路设计.md` §9.2;**网络通道(第 2~9 条)未开工**。 +> 未闭环项见 `docs/子系统设计/屏板链路设计.md` §9;**网络通道(第 2~9 条)未开工**。 > > **一条物理前置(已完成 2026-10-29)+ 一条实现纪律**: > ① **台架串口线已挪位**——日志口迁到 RS-232 侧后,台架那根线改接 CN1 的 RS232#1 端子 diff --git a/docs/子系统设计/屏板链路设计.md b/docs/子系统设计/屏板链路设计.md index 83e5ee38..f2406b6f 100644 --- a/docs/子系统设计/屏板链路设计.md +++ b/docs/子系统设计/屏板链路设计.md @@ -68,9 +68,9 @@ flowchart TB | 板地 `CGND`(或任一 GND 脚) | 屏板 `GND` | **两板各自供电必须接第三根共地线**,浮地的形态同样是彻底收不到 | - 丝印 `TX/RX` 是**屏板自己发出/接收的视角**,所以主机侧**交叉同名接**:主机 TX 接丝印 `RX`、主机 RX 接丝印 `TX`。 -- 屏板排针收发脚与屏板网表(PA2=发 / PA3=收)的对应关系未经屏板方确认(实测按网表接不通、对调才通)。 - **唯一实操验收口径 = 接完看主机 `rx` 计数涨不涨**(涨 = 方向对,与帧内容无关),不涨当场对调两根信号线; - 产品线束定版前向屏板方核实实际收发脚。**不要按屏板 readme 与"TX 对 TX"直连**——同边对接两端都静默且无任何报错可看。 +- 排针方向**以丝印为准**:屏板方已确认丝印 `RX` = 屏板收、丝印 `TX` = 屏板发(网表标注的 PA2=发 / PA3=收 + 与实物排针不是一回事,照网表接两端都静默)。接完的实操验收口径仍是看主机 `rx` 计数涨不涨 + (涨 = 方向对,与帧内容无关),不涨就对调两根信号线。**不要按屏板 readme 与"TX 对 TX"直连**。 - **别去 CN1 找 USART1 端子**:`ST_TX0` / `ST_RX0` 在网表里只连 `U5.A10` / `U5.B10` 与 MCU 101/102 脚; CN1 上的 `RS232_*` 是 UART5 / USART2 经收发器之后的电平。同一个 `U5` 上还挂着 USART3 的 `ST_TX2` / `ST_RX2` (`U5.C7` / `U5.C6`),别抓错针。3.3 V TTL 直连,不串电阻,没有方向控制脚可接。 @@ -214,29 +214,12 @@ flowchart TB | `sb_link_get_stats(&st)` | 任意上下文 | 计数快照(rx/ok/crc/len/fmt/keys/tx/done/drop/fb/bad/us/off/dfok/dfold…) | | `sb_crc16` / `sb_frame_a_parse` / `sb_frame_b_build_image` / `sb_frame_b_verify` | 纯逻辑 | 协议层四件套,主机单测可回归 | -## 9. 验证状态 - -### 9.1 已验证 - -| 层级 | 证据(计数名 = 台架/真机日志 `[SBLINK]` 行字段) | -|---|---| -| 主机单测 | `test/host/sb_proto/` **59/59**(屏板实测向量、CRC 表与屏板查表逐字节交叉验证);`test/host/sb_link/` **164/164**(ORE 的 SR→DR 顺序在桩里真执行、非阻塞错误不得重挂、busy 期间帧缓冲逐字节冻结、帧 B 逐字段、周期→µs 换算、离线 9.999 s/10 s 边界与恢复、按键 FIFO 与溢出丢新;2026-10-30 延迟应答 +18:不立刻起发/凭据放行新帧/140 ms 截止保底旧帧/忙时不留扣件/陈旧凭据不放行/首帧未备同旧丢单);`test/host/sb_led_map/` **17/17** | -| 台架(PC + USB 转 TTL 顶替屏板) | `rx == 发送帧数`、`ok == rx`、`crc=0 len=0 size=6`;错波特率灌 64 B 垃圾后**自动恢复**(`rearm=0`,一次都没真失败);杜邦线噪声形态 `bits=0x02`(NE)每帧 ~1.3 次但数据零错;激励停止 10 s 准点 OFFLINE | -| 真屏板冒烟(2026-10-29) | 5 s ≈18 帧 → 278 ms/帧,与屏板 280 ms 节拍吻合;`tx==done`、一召一答无双发;**屏板出图(用户目视确认)**——屏板收帧只有"CRC 过 → 刷屏 / 不过 → 静默丢弃"两种结局且无报错通道,**出图 = 屏板亲手端到端验收了帧长 4208、CRC 覆盖 `[0,4205]`、低字节在前、1 bpp 20 B/行 MSB 在前的布局**,这是任何主机侧计数都给不出的一条证据 | -| 真屏板 10 min 连续(2026-10-29) | `rx=4258 ok=4258 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0`(**连错误中断都没进过**);`tx=4249 done=4248`(`drop=9` 全在开机头两秒帧未就绪期,窗口内零新增);`keys=53 kq=0`(逐键必到、零丢弃);`fb=902 bad=0`(每帧自校验通过);组帧峰值 `us=687 max=812` < 1 ms 预算 | -| 双通道并发(2026-10-30,真屏板在线) | 7003 侧 `test/host/remolcd_pull_test.py` INIT→LCDMEM 10 Hz 重压两轮 **1500/1500 + 700/700**、CRC 错 0、超时 0,往返 min 35 / avg 63 / max 131 ms;屏板侧 60 s 隔离窗口 rx +233 全收、**每召必答**、`drop` 零新增、`off=0`;画面一致性由"两出口同一份活显存"机制保证 | -| 长稳(串口日志实测,2026-11-13 18:31 → 2026-11-15 21:43) | 单次上电连续运行 **51.2 h**:`rx=658262 ok=658262`、`crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0`、`drop=7`(仅启动期)、`kerr=0 abor=0 bad=0`,**全程 `off=0` 零误判离线**;跨屏板自复位(≈5000 s 周期)自动续上 | -| 离线与恢复 | 断接期间 `off=1`,恢复后 `off=0`——`offline` 标志**只有**恢复分支会清,1→0 的转变即恢复路径执行过的证明(全程未重启主机) | - -### 9.2 未闭环 +## 9. 未闭环 | 项 | 内容 | |---|---| -| uiTask 拥塞面 | 制造 7003/netTask 拥塞(客户端不读、对时 relisten 突发),屏板侧应零超时、画面停最后一帧——"起发不在任务态"的直接证据 | -| 按键通路 | 延迟应答(扣件 / 凭据放行 / 140 ms 截止保底)与按键注键环(`ui_port` 8 深,满挤最旧)**尚未在有按键流量的真机上验过**——51.2 h 长稳日志 `keys=0 kq=0 dfok=0 dfold=0`,即整段运行零按键,该路径只有主机单测 `TC-SBLINK-030~033` 覆盖。验证法:接屏板按键连按,看 `keys`/`dfok` 涨、`dfold` 保持 0 | -| 目视项 | 7 个物理键逐个按、动作对照 `docs/产品需求/产品需求设计文档.md` §8.2 菜单树 + 键 9 出 `unmapped` 日志;状态灯逐位(bit1 肉眼即见;bit3 挂 104 主站看亮灭;bit4 拔采样前端;bit2/bit5 见 §6 闭锁提示);主动拔插回归(含 7003 并发面) | -| 剖析对照 | 画面静止 1 min,开屏板链路前后对比 `[PROF] uiw`(memcmp ~20 µs 成本判据) | -| 待确认 | 屏板排针实际收发脚方向(向屏板方,线束定版前);键 9/10 语义(产品侧) | +| 按键通路 | 延迟应答(扣件 / 凭据放行 / 140 ms 截止保底)与按键注键环(`ui_port` 8 深,满挤最旧)尚未在有按键流量的真机上验过——现网日志 `keys=0 kq=0 dfok=0 dfold=0`,该路径只有主机单测 `TC-SBLINK-030~033` 覆盖。验证法:接屏板按键连按,看 `keys`/`dfok` 涨、`dfold` 保持 0 | +| 键 9/10 语义 | 产品侧未定 | ## 10. 坑账本 @@ -245,7 +228,7 @@ flowchart TB 2. **`ReceiveToIdle_IT` 是一次性的**:漏重挂 = 链路永久静默,且没有任何报错;ORE 不自己清,一次噪声打死接收。 3. **NE/FE 非阻塞、ORE 阻塞**:重挂判据用 `RxState == READY` 而不是错误位;台架"NE 每帧出现 + `rx_ok` 照涨" = 能用的告警,**不是**故障(无屏蔽杜邦线常态);真故障形态是 ORE(`bits=0x08`),本链路 6 B/280 ms 不该出现。 -4. **CH340 收不了 700 kbaud 全帧**(§3.3)——收不全 ≠ 固件没发,`tx == done` 自证,别据此改固件。 +4. **CH340 收不了 700 kbaud 全帧**(§3.2)——收不全 ≠ 固件没发,`tx == done` 自证,别据此改固件。 5. **`.ioc` 不保存 UART 波特率**:改波特率只能在 `USER CODE` 区覆盖 `Init` 后重调 `HAL_UART_Init`(§2)。 6. **全局 UART 回调是工程单例**:新通道只在 `rs485.c` 加转发行、不自写一份(§2)——"中断进来了但没人处理" 的表象是"屏板一直超时",极易误判成协议错。