# CHANGELOG — vd_960 (DLD960) 本文件记录 DLD960 整机(双 MCU 配套)的版本发布历史。 单侧固件的细粒度演进见 `vd960Loop/docs/devlog.md` 与 `vd960DBN/docs/devlog.md`。 --- ## vd960DBN V1.02.05 — 2026-08-21(DBN 通信板单侧更新) > 本次为 **vd960DBN 单侧发布**(Loop 固件未变,可正常配套)。涵盖 2026-08-20 联网稳定性修复系列 + 2026-08-21 MQTT 协议 V1.10 实现。 **配套版本矩阵** | 组件 | 版本 | |------|------| | vd960DBN 固件 (CH32V208, DLD960GA) | **1.02.05** | | vd960Loop 固件 (AT32F421) | 1.0(不变) | | DLD960Loop 串口协议(0x7F / 0x9F OTA) | V1.05(不变) | | DLD960 TCP JSON 协议(:5960) | V1.03(不变) | | DLD960 IoT MQTT 协议 | **V1.10** | | DLD960 BLE 协议 | V1.02(不变) | ### 🆕 MQTT 协议 V1.10:网络上报携带地感版本(配合远程 OTA 版本核对) - `dev_info_query` 响应 / `initialize` 上报 data 新增 **`loop_ver`**(地感固件 `"主.次.次"`)+ **`loop_hw_ver`**(地感硬件)——来自 Loop `0x4A` 查询缓存(上电自动查一次 + OTA done 后刷新),查询未完成/失败为空串 - 新增 §4.25 **`loop_version_query`** 命令:平台实时查询 Loop 版本(0x4A 异步 → 回包 `loop_ver`/`loop_hw_ver`/`version_str`),超时回 `code=5` - 固件实现:`loop_uart_proto.c/h` 新增 `LoopVerCache` 版本缓存 + `lup_cache_from_info()`/`lup_refresh_version_cache()`;`iot_mqtt_srv.c` 新增 `iot_verq_poll()` 异步回包 + 后台刷新 - **单测 44 断言全过**(版本解析/缓存/异步回包时序,`tests/test_iot_loop_ver.c`) ### 🔧 联网稳定性修复(2026-08-20 系列) - **SocketSend 0x11 死循环**:WCHNET `WCHNET_ERR_MEM(0x11)` 为瞬时发送缓冲不足(`WCHNET_NUM_TCP_SEG=2`)——改为 200ms 退避重试(≤10 次),不再 3 次强制断连;`SocketCreat` 失败置 `SocketId_TCP=0xFF` + 中止 Connect(不再 timeout 死循环) - **OTA 下载失败**:`ota_json_extract_hex()` 兼容 `json.dumps` 空格(`"data": "..."`),单片 CRC 全错根因闭环 - **OTA 刷写状态语义**:刷写成功状态回 `idle`(镜像保留可重刷)+ 补 `ota_report done/failed` 主动上报(平台判定主依据) - **联网复位事故**:OTA 命令缓冲合并 union(RAM 90% 栈余量不足 → HardFault 复位闭环) ### 📋 已知约束 - UART2 0x4A 版本查询与 `loop_data`/事件上报共用总线(低频命令,理论无冲突)——**待板上验证时序** - OTA done 后缓存刷新存在 Loop 复位时间窗(查询可能超时,可接受;平台可用 `loop_version_query` 主动核对) - BLE→Loop OTA 透传模式无自动退出(V1.02.03 遗留,升级后需断电重启) ### 验证 - ✅ gcc 隔离单测:`test_iot_loop_ver.c` 44 例(V1.10)+ 既有 ota/offlog/snapshot/mqtt 单测全过 - [ ] 待板级回归:MQTT 联网长稳、`loop_version_query` 实际回包、OTA 全流程 --- ## vd960DBN V1.02.04 — 2026-08-19(DBN 通信板单侧更新) > 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议未变更,可正常配套)。 **配套版本矩阵** | 组件 | 版本 | |------|------| | vd960DBN 固件 (CH32V208, DLD960GA) | **1.02.04** | | vd960Loop 固件 (AT32F421) | 1.0(不变) | | DLD960Loop 串口协议(0x7F / 0x9F OTA) | V1.05(不变) | | DLD960 TCP JSON 协议(:5960) | V1.03(不变) | | DLD960 IoT MQTT 协议 | V1.07(不变) | | DLD960 BLE 协议 | V1.02(不变) | ### 🔧 SPI Flash 存储适配修复 - **识别去厂商代码**:`W25Qxx` 宏去 `0XEF` 前缀、`SPI_Flash_ReadJEDEC_ID()` 删厂商校验、`storage_init` 低字节匹配——兼容其他厂家同容量型号(如 0x1A 厂商) - **恢复 factory 配置写入**:解除 2026-08-13 止血(根因 8-17 已闭环),换新空片(W25Q128)后不再每次上电进出厂初始化,配置读写恢复正常 - **板级验证通过**(2026-08-19):W25Q128 配置读写正常 --- ## vd960DBN V1.02.03 — 2026-08-19(DBN 通信板单侧更新) > 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议未变更,可正常配套)。 **配套版本矩阵** | 组件 | 版本 | |------|------| | vd960DBN 固件 (CH32V208, DLD960GA) | **1.02.03** | | vd960Loop 固件 (AT32F421) | 1.0(不变) | | DLD960Loop 串口协议(MCU 间 0x7F / 0x9F OTA) | V1.05(不变) | | DLD960 TCP JSON 协议(:5960) | V1.03(不变) | | DLD960 IoT MQTT 协议 | V1.07(不变) | | DLD960 BLE 协议 | V1.02(不变) | ### 🔧 BLE→Loop OTA 升级修复(0x9F 帧透传回 BLE) - **现象**:UART2 RX DMA 改造后,通过 BLE 给地感(Loop MCU)OTA 升级失效 - **根因**:DMA poll 帧解析 `lup_feed_byte()` 只认 0x7F,Loop bootloader 回的 0x9F 响应帧(pre_ok/addr_ok/data ACK)全部被吞;OTA 为**停等协议**(0xA7 WITH_BACK 每块必回 ACK),工具等不到 ACK 升级卡死 - **修复**:新增 `lup_feed_byte_ota()` 0x9F 帧状态机(SUM 校验无 XOR);`uart2_dma_poll` 按 `g_flag_counter_ota.flag` 切换 0x9F/0x7F 解析器;`uart_srv` OTA 分支 0x9F 帧透传回 BLE + 清 flag;OTA 溢出阈值放宽 + 收帧 tick 归零 - **验证**:gcc 隔离单测 8 断言全过;**板级 BLE OTA 全流程实测通过**(2026-08-19) - **已知约束**:OTA 模式无自动退出机制(`g_flag_counter_ota.flag` 置 1 后需断电重启恢复 0x7F 通信),维持现状 ### 📦 脱机日志快照流 + hex 上报(2026-08-18 已含,协议 V1.03/V1.07) - TCP/MQTT `log_*` 命令支持 `stream=snapshot` 传感快照流(复用命令 + stream 字段,不新增命令码) - `log_query` records 改 **hex 原始字节**上报(OfflogEvt 32B→64 hex / SnapRec 64B→128 hex,2 条快照 406B < 800B 缓冲) - MQTT 查询命令补齐:`ssc_net_query` / `iot_net_query` / `iot_topic_query`(协议命令表全对齐) --- ## vd960DBN V1.02.01 — 2026-08-17(DBN 通信板单侧更新) > 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议均未变更,可正常配套)。 **配套版本矩阵** | 组件 | 版本 | |------|------| | vd960DBN 固件 (CH32V208, DLD960GA) | **1.02.01** | | vd960Loop 固件 (AT32F421) | 1.0(不变) | | DLD960Loop 串口协议(MCU 间 0x7F) | V1.05(不变) | | DLD960 TCP JSON 协议(:5960) | V1.02(不变) | | DLD960 IoT MQTT 协议 | V1.06(不变) | | DLD960 BLE 协议 | V1.02(不变) | ### 🔴 P0 稳定性修复:频繁"复位"根因闭环(栈溢出) - **现象**:恢复快照区功能后设备 100~180ms 一轮"复位"循环(RSTSCKR 无复位标志 = PC 跑飞,非硬件复位) - **根因**:`.bss ≈ 41.7KB` 挤占 RAM → 栈仅 ~1.9KB → `load_cfg/output_cfg` 的 printf 栈峰值触顶 → 覆盖返回地址 → PC 跑飞跳回 0 重启 - **修复**: - RAM 瘦身两轮:ETH_MAX_PACKET_SIZE 1520→768、RECE_BUF_LEN 1400→1024、ARP 表 50→16、MQTT 发送缓冲 1024→800、loop_data payload 1400→800 → **栈 1.9KB → 6.3KB** - load_cfg 字符串 0 终止保险(防 Flash 配置字符串 %s 越界打印) - 快照区初始化延后至开机 3s(避开启动早期 SPI 重负载窗口,非根因但减压) ### 🟢 可靠性:UART2 RX DMA 循环接收 - 根治遗留问题"PRINT 关中断(~7.4ms)期间 UART2 丢字节 → checksum fail(1-3 分钟一次)" - DMA1_Ch6 循环模式硬件收字节(不依赖 CPU 中断),主循环轮询消费;512B 环形缓冲 + 溢出保护 - 帧解析状态机移入主循环,消除中断竞争 ### 🟢 资源与代码卫生 - .bss 46KB → 41.7KB;中断路径大数组 static 化(栈峰值 -1.8KB) - 调试代码结案清理:移除 BOOT_CNT 诊断打印、_dbg_cnt 心跳打印;保留 fault_diag 基础设施(未来疑难杂症复用) ### 📋 其他 - 固件版本三段式:`FIRMWARE_VER="1.02.01"`(MAIN=1 SUB=2 SUBSUB=1) ### 已知约束 - 设备无 RTC,时钟同步依赖平台下发(校准前 ts 为上电秒数) - BLE 上报版本为 MAIN/SUB 两字节(1.02),SUBSUB 仅字符串上报(MQTT/TCP JSON) - 快照区延后 3s 初始化:开机 3s 内传感数据不落盘(设计接受) - UART2 RX DMA 占用 DMA1_Ch6(全工程唯一,无冲突) ### 验证 - ✅ 板级:无异常重启;MQTT(159.75.137.141:1883)、BLE 广播、配置加载正常 - [ ] 待回归:UART2 DMA 长时间运行(checksum fail 消失)、TCP JSON 命令交互、快照 BLE 0x28/0x29/0x2A 查询 --- ## V1.0.0 — 2026-07-16(首个正式发布) **配套版本矩阵** | 组件 | 版本 | |------|------| | vd960Loop 固件 (AT32F421) | 1.0 | | vd960DBN 固件 (CH32V208, DLD960GA) | 1.0 | | DLD960Loop 串口协议(MCU 间 0x7F) | V1.05 | | DLD960 串口通信协议(TTL) | V1.01 | | DLD960 TCP JSON 协议(:5960) | V1.02 | | DLD960 IoT MQTT 协议 | V1.06 | > ⚠ 自协议 V1.05 起,Loop 固件与 DBN 固件必须同版本配套刷写,禁止混跑(variation 字段宽度变更导致帧格式不兼容)。 ### vd960Loop(检测 MCU,AT32F421) **检测算法**(自 DLD154V4B 移植并四通道化,针对 M4 优化) - 主循环 tick 50ms → **10ms**,单路 IIR(ALFA_CAP1=79,τ≈32ms,较 8051 时代快 5 倍) - 斜率限幅 MAX_SLOPE_RATE=5%(含低基值 floor=100 防锁死) - 进入确认 ENTRY_CONFIRM=3(连续 3 次低于阈值才判有车,抗尖峰误触发) - 基线冻结超时 10s + ±2% 稳定性检查:温漂/换线圈可自适应,慢速进车不误吸收 - 稳定期(上电 128 样本)旁路 IIR/限幅,窗口 100 快速收敛;常态基线窗口 500(5s 更新,噪声抑制 22×) - 每通道可配置 hold_time(有限存在)与 relay_delay(继电器延时);有限存在超时执行**全通道重启**重建基线 **串口上报(0x7F 协议,UART @192000)** - 0xC0 传感数据主动上报:频率、variation(**3B 有符号**,`Origin − CAPVD`,V1.05)、车状态 - 时间量(通过时间/车间距)统一 **50ms 单位**;上电 3 秒抑制主动上报 - 继电器输出次数上报;0x4A 版本查询(CAPVD→实际频率 uint64 精确换算) ### vd960DBN(通信 MCU,CH32V208) **TCP JSON 服务(:5960,协议 V1.02)** - 密码鉴权 + 18 条命令(新增脱机日志 log_stat/log_query/log_clear) - 鉴权状态机 + 15 条命令;服务异常自动重启(3 条件 + 3 次限额 + 10min 冷却) - event_report 客户端必答:5s 超时重发同 msg_id/原始 ts ×3 **IoT MQTT(协议 V1.06)** - 双主题 `dld960/{sn}/srv` + `dld960/{sn}/dev`,消息类型由 `cmd` 区分 - 上电 initialize 上线消息(dev_serial/model/hard_ver/soft_ver) - loop_data 三档调度:空闲按配置间隔 / 活动 300ms / **car_state 翻转沿立即上报** - event_report 平台必答 + 16 深环形队列,ACK 后出队;不受 report_config.enable 门控 - 设备时钟同步方案B:平台经 report_config 下发 Unix ts,设备无 RTC 也能上报真实时间 - 稳定性修复:mqtt_publish 缓冲溢出发垃圾包致 broker RST 风暴(现场 P0)、packet_id=0 断连、PINGREQ 保活、分批发送(MSS=576,Publish≤500B) - loop_data 陈旧快照修复:0xC0 帧双消费路径统一摄取,事件与缓存同源 - **脱机事件日志(W25Q32 环形 8064 条,V1.06 新增)**:log_stat / log_query / log_clear 三命令;BOOT 复位原因、MQTT 连接/断开、event ACK 超时、线圈事件、时钟锚点共 10 类;掉电不丢 **基础设施** - BLE 小程序配置 + OTA;Loop MCU ISP 串口透传升级 - WCHNET TCP/IP(listen=N / data=N+1)、simple_json 解析器 6 项 bug 修复 ### 文档与工具 - 四份协议文档 + 硬件资源文档齐套(见 README 协议矩阵) - DBNetClient(TCP JSON 测试)、DBNMQTTool(MQTT 双主题测试) - 双 MCU devlog、验收标准、variation 分析报告、现场事故归档 ### 已知约束 - 设备无 RTC,时钟同步依赖平台下发(校准前 ts 为上电秒数) - CH32V208 栈资源紧张:2KB 任务栈内勿连续 PRINT,勿随意扩大全局 BSS --- ## 版本号规则 - 整机发布 tag:`vX.Y.Z`(本仓库 git tag + Gitea Release) - 固件版本:两侧 `cmcng.h` 的 `FIRMWARE_VER`,随整机版本同步 - 协议文档版本:各文档内修订记录表独立演进,发布时在配套矩阵中锁定