fix(vd960DBN): 0x8F 接入 DBN 私有指令处理器 + net_srv 裸 printf + devlog 行尾

按用户 2026-09-10 四条指示:

1) 0x8F 下行的"本地处理"明确为 CH32V208GBU6 私有指令 —— 只作用在自身读写配置上,
   一般不转发。实现: 不再留空壳计数, 直接复用 BLE 侧同一个分发器
   manage_dbn_ble_default() (dbn_ble_srv.c:729)。两侧帧布局完全一致
   (pkg[1]=Addr, pkg[2]=LEN, pkg[3]=CMD, pkg[4..]=Value), 零适配。
   响应仍走 g_buf_ble_response -> BLE 通知; 不回 4G —— Air780 侧 parser 只认 0x7F,
   回 0x8F 也没人接。
   增加 OTA 门控: g_flag_counter_ota.flag != 0 时拒绝私有指令 ——
   私有指令会写自身配置(碰 flash), 与 OTA 刷写并发是自找麻烦。
   魔数宏改用 dbn_ble_srv.h 的 MAGIC_BYTE_DBN_DEFAULT, 不再硬编码 0x8F。

2) 0x7D 帧: 删除/不理会。V1.11 曾提的 DBN<->Air780 握手/配置同步构想作废,
   代码里本就没实现, 正式协议也从未收录。devlog 待办项移除, 记入"已定案"。

3) net_srv.c:125 裸 printf() -> PRINT。该文件本已用 PRINT 53 处, 无需补 include。
   DEBUG=0 时随 PRINT 一起消失, 不再出现"往未初始化的 USART1 写字节"。

4) devlog.md 行尾统一 CRLF (修复 132 个孤立 LF: 顶部 V1.13 条目原为 LF)。

验证 (host 单测, 代码从 usart_biz.c 原样抽取, gcc -Wall -Wextra -Werror 零警告):
  15 组用例全部通过, 其中新增:
  - 0x8F -> manage_dbn_ble_default 被调用 1 次, 传入 len==全帧长, 内容逐字节一致, 未转发
  - OTA 期间 0x8F -> 处理器未被调用, 但仍计数 (可观测)
  原有 13 组 (魔数分流/最大帧/坏帧回找魔数/截断帧不丢帧/LEN 非法/0x9F 忽略...) 保持通过。

待板级验证: 需 MounRiver 工具链编译 + 实机 (本机无 riscv 工具链)。
This commit is contained in:
wangfq
2026-09-10 16:41:09 +08:00
parent d4d57f6487
commit c879ed04e2
4 changed files with 161 additions and 143 deletions
@@ -156,7 +156,10 @@ void UART1_SendString(uint8_t *buf, uint16_t len);
/* ---- 4G 通道: UART1 <-> Air780 (协议 §6.1 纯字节流透传) ---- */
void uart1_dma_init(void); /* 初始化 (DEBUG!=0 时为空实现) */
void uart1_dma_poll(void); /* 主循环轮询: 消费 DMA 缓冲 -> 分流 */
void uart1_dma_poll(void);
/* DBN(CH32V208GBU6) 私有指令分发器 (dbn_ble_srv.c) —— 0x8F 帧, 4G 下行本地指令复用同一入口 */
void manage_dbn_ble_default(uint8_t *pkg, uint8_t len); /* 主循环轮询: 消费 DMA 缓冲 -> 分流 */
extern uint32_t g_uart1_fwd_to_air; /* 上行转发帧数 (UART2->UART1) */
extern uint32_t g_uart1_fwd_to_loop; /* 下行转发帧数 (UART1->UART2, 0x7F) */
extern uint32_t g_uart1_local_cnt; /* 下行本地处理帧数 (0x8F) */
@@ -122,7 +122,7 @@ uint32_t dev_time_now(void)
void mStopIfError(u8 iError)
{
if (iError == WCHNET_ERR_SUCCESS) return;
printf("Error: 0x%02X\r\n", (u16)iError);
PRINT("Error: 0x%02X\r\n", (u16)iError); /* 原裸 printf: DEBUG=0 时会去写未被初始化的 USART1 */
}
void mqtt_connect(void)
@@ -10,6 +10,7 @@
#include "cmcng.h"
#include "debug.h" /* DEBUG 宏: 4G 版本以 -DDEBUG=0 编译, 此时 printf 不占用 USART1 */
#include "loop_uart_proto.h"
#include "dbn_ble_srv.h" /* MAGIC_BYTE_DBN_DEFAULT(0x8F): DBN 私有指令魔数 */
#include <string.h>
#include "dbn_ble_srv.h"
#include "ota_srv.h"
@@ -119,7 +120,8 @@ void uart2_dma_poll(void)
* 定位: 4G 通道中 vd960DBN 只做"字节流透传", 零业务转换 ——
* 上行: Loop 0x7F 帧(UART2) --校验通过后原样转发--> UART1 --> Air780 解析转 JSON
* 下行: Air780 帧(UART1) --魔数分流--> 0x7F: 转发 UART2(给 vd960Loop)
* 0x8F: DBN 本地处理
* 0x8F: DBN(CH32V208GBU6) 私有指令 ——
* 只作用在自身读写配置上, 一般不转发
*
* 硬约束:
* 1) 只转发 lup_verify_checksum() 通过的完整帧。Air780 侧靠 loop_state 变化沿判车,
@@ -143,7 +145,7 @@ void uart2_dma_poll(void)
#endif
#define UART1_MAGIC_LOOP LUP_MAGIC /* 0x7F: 转发给 vd960Loop */
#define UART1_MAGIC_LOCAL 0x8F /* 0x8F: DBN 本地处理 (BLE 侧同名魔数) */
#define UART1_MAGIC_LOCAL MAGIC_BYTE_DBN_DEFAULT /* 0x8F: DBN 私有指令(自身配置读写), 不转发 */
#define UART1_DMA_BUF_LEN 512
#if (UART1_AIR780_EN)
@@ -159,7 +161,7 @@ static uint16_t uart1_rx_need = 0; /* 本帧总长, 0 = 尚未定长 */
/* 通道计数: 现场核对"上行转发数 == Air780 实收数", 比翻日志可靠 */
uint32_t g_uart1_fwd_to_air = 0; /* 上行: UART2 -> UART1 转发帧数 */
uint32_t g_uart1_fwd_to_loop = 0; /* 下行: UART1 -> UART2 转发帧数 */
uint32_t g_uart1_local_cnt = 0; /* 下行: 本地处理帧数 (0x8F) */
uint32_t g_uart1_local_cnt = 0; /* 下行: DBN 私有指令帧数 (0x8F) */
uint32_t g_uart1_badchk = 0; /* 下行: 校验失败帧数 */
uint32_t g_uart1_drop = 0; /* 下行: DMA 溢出丢弃次数 */
@@ -171,8 +173,14 @@ static void uart1_dispatch_frame(uint8_t *pkg, uint16_t len)
g_uart1_fwd_to_loop++;
UART2_SendString(pkg, len);
} else {
/* 0x8F -> DBN 本地处理 (预留: 具体行为待协议细化, 先只计数) */
/* 0x8F -> DBN(CH32V208GBU6) 私有指令: 只作用在自身读写配置上, 不转发给 Loop/Air780。
* 直接复用 BLE 侧同一个分发器 manage_dbn_ble_default() —— 两边帧布局完全一致
* (pkg[1]=Addr, pkg[2]=LEN, pkg[3]=CMD, pkg[4..]=Value), 零适配。
* OTA 期间拒绝: 私有指令会写自身配置(碰 flash), 与 OTA 刷写并发是自找麻烦。 */
g_uart1_local_cnt++;
if (g_flag_counter_ota.flag == 0) {
manage_dbn_ble_default(pkg, (uint8_t)len);
}
}
}
+12 -5
View File
@@ -21,7 +21,11 @@
且**只转发 `lup_verify_checksum()==0` 的完整帧**。插入点必须在 BLE 分支改写 `pkg[0]=0x8F` 之前 ——
否则会把已改魔数的帧发给 Air780。
**下行**Air780 → DBN):UART1 收帧 → **魔数分流**`0x7F``UART2_SendString()` 给 Loop`0x8F` → DBN 本地处理(预留,当前仅计数)。
**下行**Air780 → DBN):UART1 收帧 → **魔数分流**`0x7F``UART2_SendString()` 给 Loop
`0x8F`**DBN(CH32V208GBU6) 私有指令**:只作用在自身读写配置上,**一般不转发**(用户 2026-09-10 澄清)。
落地方式:直接复用 BLE 侧同一个分发器 `manage_dbn_ble_default()` —— 两边帧布局完全一致
`pkg[1]=Addr, pkg[2]=LEN, pkg[3]=CMD, pkg[4..]=Value`),零适配。响应仍走 `g_buf_ble_response`→BLE
不回 4GAir780 侧 parser 只认 `0x7F`,回 `0x8F` 也没人接)。**OTA 期间拒绝**:私有指令会写自身配置(碰 flash),与刷写并发是自找麻烦。
### 三个关键设计决定(含理由)
@@ -42,7 +46,8 @@
此时 `#if(DEBUG)` 为假:`PRINT` 是空宏,且 `USART_Printf_Init()` 里 USART1 的配置分支整段不参与编译
(已核对 `USART_Init/USART_Cmd` 均在 `#if(DEBUG == DEBUG_UART1)` 内)→ USART1 干净地交给本文件。
- 调试版(DEBUG!=0)本通道编译为空实现,**`debug.h`/`debug.c` 一行未改**,printf 行为完全不变。
- ⚠ 遗留`net_srv.c:125` 有一处`printf()`(错误路径)`DEBUG=0`仍会调用,建议改为 `PRINT`(列入待办)。
- 已处理`net_srv.c:125``printf()`(错误路径)→ 改 `PRINT``DEBUG=0` `PRINT` 一起消失,
不再出现"往未初始化的 USART1 写字节"这种恶心事。该文件本身已用 `PRINT` 53 处,无需补 include。
### 验证
@@ -67,13 +72,15 @@
- 与 Air780 必须**交叉**`DBN_PB6(TX) → Air780_RX``DBN_PB7(RX) ← Air780_TX`
- 波特率两侧一致:115200(Air780 侧日志 `Uart_ChangeBR uart1, 115200`
### 已定案
- `0x7D` 帧:**删除/不理会**(用户 2026-09-10)—— V1.11 曾提的 DBN↔Air780 握手/配置同步构想作废,
代码里本就没有实现,`docs/DLD960_IoT_MQTT协议.md` 正式协议也从未收录。历史条目保留不动(记录当时的想法)。
### 仍待办
- [ ] `0x8F` 下行的本地处理行为(当前仅计数;协议未细化具体动作)
- [ ] `0x7D` 握手/配置同步帧(V1.11 曾提,未进正式协议,暂预留)
- [ ] BLE 设置服务器/topic 时同步下发 Air780 配置(V1.12 第 2 条)
- [ ] 通道切换策略(V1.12 第 3 条,待讨论;暂定默认 4G)
- [ ] `net_srv.c:125``printf``PRINT`
- [ ] 板级联调:编译烧录 + 帧计数对齐 + 断线重连
---