feat(vd960DBN): 实现 DLD960Loop 串口通信协议 (0x7F)

新增:
- docs/DLD960Loop_串口通信协议.md — 协议文档 V1.02
- loop_uart_proto.h/c — 协议实现: checksum/组包/解析/帧状态机/命令状态机

修改:
- usart_biz.c: 使用 lup_feed_byte() 帧解析器替代 timeout heuristic; 波特率修正为 115200
- tcp_json_srv.c/h: loop_param_set/query 真实实现(0x63/0x64), 0xC0 传感器推流, 延迟响应机制
- peripheral_main.c: 添加 tcp_json_push_sensor() 调用, 帧解析器超时保护

校验验证: 5个协议例程 XOR+SUM 全部通过
This commit is contained in:
wangfq
2026-07-02 09:26:34 +08:00
parent 4e75312a0f
commit 4fbda96078
7 changed files with 1522 additions and 64 deletions

View File

@@ -0,0 +1,237 @@
# DLD960Loop 串口通信协议
# 1 通信说明
## 1.1 通信方式
串口通信波特率115200
# 2 协议格式
Package
| 1Byte | 3Bytes | 0~64Bytes | 2Bytes |
| --- | --- | --- | --- |
| Magic byte | Header | Value | Check Bytes |
## 2.1 Magic Byte(1Byte)
标识协议类型,也表示数据包开始信息。
| Magic Byte | 说明 |
| --- | --- |
| 0x7F | 屏、地感检测、探头的配置和查询协议,或者部分雷达的协议 |
| 0x8F | |
| 0x9F | OTA 用途 |
## 2.2 Header(3Bytes)
当Magic Byte为 0x7F时Header字节定义如下
| 1Byte | 1Byte | 1Byte |
| --- | --- | --- |
| Addr 地址 | LEN 数据长度 | CMD 命令字节 |
* Addr 默认0
* LEN数据长度表示数据包的有效数据(Value)长度,包括命令(CMD Byte)和数据(Data Bytes)
* CMD 命令字节
## 2.3 校验字节(Check Bytes2Bytes)
当Magic Byte为0x7F时校验字节实现如下
| 1Byte | 1Byte |
| --- | --- |
| XOR 异或校验 | SUM 和校验 |
> XOR 异或校验校验从Addr字节开始到命令数据的最后一个字节结束
> SUM 和校验校验从Addr字节开始到命令数据的最后一个字节结束。
# 3 Cmd详解
## 3.01 获取设备版本号(0x4A)
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 01 4A | |
| **Length** | 3 Byte | 0 Byte |
> eg: `7F 00 01 4A 4B 4B`
返回:
| | Header | Status + Hard\_Main + Hard\_Sub + Hard\_SSub + Soft\_Main + Soft\_Sub + Soft\_SSub |
| --- | --- | --- |
| **Value(Hex)** | 00 08 4A | xx |
| **Length** | 3 Byte | 7 Byte |
## 3.02 设备复位(0x6D)
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 01 6D | |
| **Length** | 3 Byte | 0 Byte |
设备无回复。
> eg:  `7F 00 01 6D 6C 6E`
## 3.03 出厂初始化(0x92)
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 01 92 | |
| **Length** | 3 Byte | 0 Byte |
> eg: `7F 00 01 92 93 93`
返回:
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 02 92 | 00/01(00 success) |
| **Length** | 3 Byte | 1 Byte |
> eg: `7F 00 02 92 00 90 94`
## 3.04 读写线圈灵敏度列表0x8A
| | Header | R/WAmount Amount \* (SensityIn + SensityOut) |
| --- | --- | --- |
| **Value(Hex)** | 00 04 8A | xx |
| **Length** | 3 Byte | (2 + 2\*x )Byte |
> R/W: 1字节0 Read 1 Write
> Amount1字节灵敏度值的数量 当R/W为 Write时有效最小3
> SensityIn两字节触发灵敏度值当R/W为 Write时有效
> SensityOut两字节释放灵敏度值当R/W为 Write时有效
返回
| | Header | Amount,  Amount \* SensityValue |
| --- | --- | --- |
| **Value(Hex)** | ADDR 03 8A | xx |
| **Length** | 3 Byte | (1 + 2\*x) Byte |
## 3.05 设置车检器多路参数(0x63)
| | Header | AutoMode + Amount + Param\[Sensitivity, Loop_Delay, Output_Mode, Exist_Mode, Direction_Mode\] |
| --- | --- | --- |
| **Value(Hex)** | 00 xx 63 | xx |
| **Length** | 3 Byte | (2 + 5 \* Amount) Byte |
* AutoMode: 是否处于自动模式自动调频0表示不启用默认0。
* Sensitivity 低四位表示灵敏度0~9级值越大灵敏度越高默认7高四位表示高低频其中\[4,5\]表示线圈的高低频。
* Loop\_Delay: 地感延时时间0~200 0.1s为一级,延时时间范围:\[0, 20秒\]
* Output\_Mode 低三位有效地感输出方式0 - 存在输出1-进入脉冲2-离开脉冲3-方向判别高5位表示SafeMode是否开启安全模式 0 关闭 0 开启安全模式分钟为单位。
* Exist\_Mode低四位表示地感存在方式0-永久存在非0-有限存在的分钟数;
* Direction\_Mode:
* 低三位表示方向判别模式0 表示触发模式 1-6 表示方向判别的输出模式对应以前的 0-5,   update 2023-02-24
* 高四位表示Function\_Mode功能模式是否启用特殊的模式
| | Header | Status |
| --- | --- | --- |
| **Value(Hex)** | 00 02 63 | 00/01 |
| **Length** | 3 Byte | 1 Byte |
## 3.06 读取车检器多路参数(0x64)
| | Header | Param |
| --- | --- | --- |
| **Value(Hex)** | 00 01 64 | |
| **Length** | 3 Byte | |
返回:
| | Header | AutoMode+Amount + Data\[Sensitivity, Loop_Delay, Output_Mode, Exist_Mode, Direction_Mode, freq1,  freq2, freq3\] |
| --- | --- | --- |
| **Value(Hex)** | 00 xx 64 | XX |
| **Length** | 3 Byte | (2 + 8 \* Amount) Byte |
## 3.07 设备主动上报传感信息(0xC0)
设备主动上报传感信息指令,具体传感数据需要根据不同的类型进行解析。
| 7Fh | ADDR | Len | C0 | SensType(1Byte) | SubPkgFlag(1Byte) | SensData | XOR | SUM |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
SensType: 传感数据类型
SubPkgFlag: 分包标记 SubPkgFlag高四位表示分包数量 SubAmount低四位表示为当前分包中第几个分包 SubSequence其中 SubSequence = \[1,SubAmount\]
* 00 表示无分包是一条数据完整的记录
* 当SubAmount不为0时SubSequence从1开始到SubAmount结束整合为一条完整的数据包。
* 当SensType为0x05时SubPkgFlag作为传感数据使用。
* 当SensType为0x06、0x07、0x09时SubPkgFlag的Seq和SubAmount分开各用一个字节表示。
SensData传感数据
| SensType | 类型说明 | SensData | 传感数据说明 |
| --- | --- | --- | --- |
| 0x0C | 多线圈传感信息 | | 四路线圈 |
| | | | |
上报线圈传感数据单元(多路线圈,每一路线圈单元的配置)
| 字段 | 字节数 | 内容 | 详情 |
| --- | --- | --- | --- |
| 配置 1 | 1 | freq\_level(2bit), Direction(1bit)freq\_type(1bit), sens(4bit) | 线圈 1 配置freq\_level:高低频两个比特位00 表示高频(33nF),01表示中高(43nF), 10表示中低(66nF), 11表示低频(76nF)。Direction: 0 表示触发1 表示方向判别freq\_type: 0 表示初始频率1 表示当前实时频率。sens低四位表示当前的灵敏度等级 |
| 线圈评估条件 | 1 | condition(4bit), loop\_state(1bit),<br>car\_state(1bit),<br>report\_msic(2bit) | loop\_condition 正常0有效环境状态条件环境状态评估值值越大干扰越大高四位有效。低四位中 其中第3位表示线圈状态0 表示正常1 表示线圈断开 2 位表示有无车0 表示无车1 表示有车低两位表示**杂项类型**0b00表示时间量0b01表示线圈断开次数0b10表示车流量数 |
| 频率 1 | 3 | frequent | 低字节在前 |
| 变化量 1 | 2 | variation | 低字节在前 |
| 杂项 | 4 | in\_out\_passtime/cut\_amount/flow\_amount | **杂项类型**,可能是时间量,也可能是线圈断开次数、车流量数,说明:<br>1、通过时间或车间距5ms为单位最大计时<br>2、线圈断开次数<br>3、车流量数 |
eg:
`7F 00 2F C0 0C 00 12 00 2A 0F 01 07 00 00 00 00 00 D2 00 75 B7 00 01 00 00 00 00 00 12 00 EC 0C 01 02 00 00 00 00 00 92 00 83 C3 00 02 00 00 00 00 00 E2 34`
指令解释
```python
7F Magic Byte
00 Addr0 default
2F Len, 0x2F=47个字节Cmd + Data
C0 Cmd
0C SensType传感数据类型0x0C 多线圈传感信息960Loop为 四路线圈车检器会有4个传感数据单元
00 SubPkgFlag分包标记00 表示无分包是一条数据完整的记录
12 00 2A 0F 01 07 00 00 00 00 00线圈1传感数据单元0b00 高频0b0 触发模式0b1实时频率0b0010 表示2级灵敏度0b0000环境正常0b0线圈正常0b0当前无车0b00 表示当前杂项参数为时间量0x010F2A频率为69418Hz0x0007变化量为70x00000000时间量为为0
D2 00 75 B7 00 01 00 00 00 00 00线圈2传感数据单元0b11 低频0b0 触发模式0b1实时频率0b0010 表示2级灵敏度0b0000环境正常0b0线圈正常0b0当前无车0b00 表示当前杂项参数为时间量0x00B775频率为46965Hz0x0001变化量为10x00000000时间量为为0
12 00 EC 0C 01 02 00 00 00 00 00线圈3传感数据单元0b00 高频0b0 触发模式0b1实时频率0b0010 表示2级灵敏度0b0000环境正常0b0线圈正常0b0当前无车0b00 表示当前杂项参数为时间量0x010CEC频率为68844Hz0x0002变化量为20x00000000时间量为为0
92 00 83 C3 00 02 00 00 00 00 00线圈4传感数据单元0b10 中低0b0 触发模式0b1实时频率0b0010 表示2级灵敏度0b0000环境正常0b0线圈正常0b0当前无车0b00 表示当前杂项参数为时间量0x00C383频率为50051Hz0x0002变化量为20x00000000时间量为为0
E2 34 校验字节
```
**注意,如果有续包,最后一包上位机无返回**。中间续包上位机返回传感类型,当前收到包的序列和子包的数量:
| 7Fh | ADDR | 07 | C0 | SensType | Seq(1Byte) | SubAmount(1Byte) | XOR | SUM |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
---
# 修订记录
| 版本 | 修订时间 | 修订说明 | 修订人 |
| --- | --- | --- | --- |
| | | | |
| V1.00 | 2026-02-11 | 创建协议初始版本 | wangfq |
| V1.01 | 2026-06-22 | 补充遗漏的接口说明 | wangfq |
| V1.02 | 2026-07-02 | 查缺补漏,补充例程说明。 | wangfq |