Files
vd_960/docs/DLD960_串口通信协议.md
wangfq ef806b6013 init: vd_960 项目初始化
- 双 MCU 架构:AT32F421(线圈) + CH32V208(通信)
- DLD960 串口通信协议 V1.01
- IoT MQTT 接口协议 V1.00 (JSON)
- TCP 接口协议 V1.00 (JSON)
2026-06-22 17:02:23 +08:00

354 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DLD960 串口通信协议
# 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 | 支持DBN查询和配置的专有协议 |
## 2.2 Header(3Bytes)
当Magic Byte为 0x7F时Header字节定义如下
| 1Byte | 1Byte | 1Byte |
| --- | --- | --- |
| Addr 地址 | LEN 数据长度 | CMD 命令字节 |
* LEN数据长度表示数据包的有效数据(Value)长度,包括命令(CMD Byte)和数据(Data Bytes)
* CMD 命令字节;
* 该协议的详细说明参考《DCP101点阵驱动说明》以及相关的地感检测485协议
当Magic Byte为0x8F时Header字节定义如下
| 1Byte | 1Byte | 1Byte |
| --- | --- | --- |
| SubPkgFlag 分包标记 | LEN 数据长度 | CMD 命令字节 |
> 分包标记 SubPkgFlag高四位表示分包数量SubAmount低四位表示为当前分包中第几个分包SubSequence其中SubSequence = [1,SubAmount]
* 00表示无分包是一条数据完整的记录
* 当SubAmount不为0时SubSequence从1开始到SubAmount结束整合为一条完整的数据包。
## 2.3 校验字节(Check Bytes2Bytes)
当Magic Byte为0x7F时校验字节实现参考《DCP101点阵驱动说明》《DPG100 485通信协议》 和相关的地感检测485协议说明部分雷探头的协议也需要支持0x7F。
当Magic Byte为0x8F时校验字节实现如下
| 1Byte | 1Byte |
| --- | --- |
| XOR 异或校验 | SUM 和校验 |
> XOR 异或校验,校验从分包标记字节开始,到命令数据的最后一个字节结束;
> SUM 和校验,校验从分包标记字节开始,到命令数据的最后一个字节结束。
# 3 Cmd详解
## 3.1 更改设备序列码(0x09)
| | Header | Dev_Serial |
| --- | --- | --- |
| **Value(Hex)** | 00 08 09 | xx |
| **Length** | 3 Byte | 6 Byte |
返回:
| | Header | status |
| --- | --- | --- |
| **Value(Hex)** | 00 01 11 | 00/01 |
| **Length** | 3 Byte | 1 Byte |
> **status**: 00 success, 01 fail
## 3.2 查询设备信息命令(0x10)
| | Header | Data Value |
| --- | --- | --- |
| **Value(Hex)** | 00 01 10 | |
| **Length** | 3 Byte | 0 Byte |
返回:
| | Header | Dev_Serial | Hard Ver | Soft Ver | Model | Num | Sub_Code | Bus1 | Bus2 | Bus3 | Bus4 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| **Value(Hex)** | 00 1C 10 | xx | 01 01 | 01 01 | xx | xx | xx | xx | xx | xx | xx |
| **Length** | 3 Byte | 6 Byte | 2 Byte | 2 Byte | 7~10 Byte | 6 Byte | 2 Byte | 1 Byte | 1 Byte | 1 Byte | 1 Byte |
| **Describe** | | 序列码 | 硬件版本号 | 软件版本号 | 产品型号 | 产品编码 | 子功能代码 | 总线1探头数 | 总线2 | 总线3 | 总线4 |
> Model: 当首字节的值在[1,12]内时表示Mode的有效字节长度。
> Sub_Code 表示子功能代码 `SUB_CODE`各个比特位对应不同的子功能0表示禁用1表示启用
| [0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] |
| --- | --- | --- | --- | --- | --- | --- | --- |
| net | iot | RFU | RFU | RFU | RFU | RFU | RFU |
| 网络 | MQTT | | | | | | |
| [8] | [9] | [10] | [11] | [12] | [13] | [14] | [15] |
| --- | --- | --- | --- | --- | --- | --- | --- |
| RFU | RFU | RFU | RFU | RFU | RFU | RFU | RFU |
| | | | | | | | |
## 3.3 设置SSC网络配置(0x11)
| | Header | Dev IP | Subnet Mask | Route IP | LSSC IP | DNS | Port |
| --- | --- | --- | --- | --- | --- | --- | --- |
| **Value(Hex)** | 00 19 11 | xx | xx | xx | xx | xx | xx |
| **Length** | 3 Byte | 4 Byte | 4 Byte | 4 Byte | 4 Byte | 4 Byte | 10 Byte |
返回:
| | Header | status |
| --- | --- | --- |
| **Value(Hex)** | 00 01 11 | 00/01 |
| **Length** | 3 Byte | 1 Byte |
> **status**: 00 success, 01 fail
## 3.4 查询SSC网络配置(0x12)
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 01 12 | |
| **Length** | 3 Byte | 0 Byte |
返回:
| | Header | Dev IP | Subnet Mask | Route IP | LSSC IP | DNS | Port |
| --- | --- | --- | --- | --- | --- | --- | --- |
| **Value(Hex)** | 00 19 12 | xx | xx | xx | xx | xx | 00 |
| **Length** | 3 Byte | 4 Byte | 4 Byte | 4 Byte | 4 Byte | 4 Byte | 10 Byte |
## 3.5 设置IoT网络配置(0x13)
| | Header | IoT Host(Domain name/IP) + Port + ClientID + Username + Password |
| --- | --- | --- |
| **Value(Hex)** | xx xx 13 | xx 00 xx 00 xx 00 xx 00 xx |
| **Length** | 3 Byte | xx Byte |
> 注:
* 数据部分的不同字段通过 0x00 分隔
* ClientID 为空时用一个空格符替代
返回:
| | Header | Status |
| --- | --- | --- |
| **Value(Hex)** | 00 01 13 | 00/01 |
| **Length** | 3 Byte | 1 Byte |
> **Status**: 00 success, 01 failed
## 3.6 查询IoT网络配置(0x14)
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 01 14 | |
| **Length** | 3 Byte | 0 Byte |
返回:
| | Header | IoT Host(Domain name/IP) |
| --- | --- | --- |
| **Value(Hex)** | 00 xx 14 | xx |
| **Length** | 3 Byte | xx Byte |
## 3.7 设置设备Topic(0x15)
| | Header | ClientID_Enable + Topic_Pub + Topic_Sub |
| --- | --- | --- |
| **Value(Hex)** | xx xx 15 | xx 00 xx 00 |
| **Length** | 3 Byte | xx Byte |
* 数据部分不同字段通过0x00 来分隔
* Client_Enable: 0x00 disable, 0x01 enable
返回:
| | Header | Status |
| --- | --- | --- |
| **Value(Hex)** | 00 01 15 | 00/01 |
| **Length** | 3 Byte | 1 Byte |
> **Status**: 00 success, 01 failed
## 3.8 查询设备Topic(0x16)
发送:
| | Header | |
| --- | --- | --- |
| **Value(Hex)** | 00 01 16 | |
| **Length** | 3 Byte | |
> **Status**: 00 success, 01 failed
返回:
| | Header | ClientID_Enable + Topic_Pub + Topic_Sub |
| --- | --- | --- |
| **Value(Hex)** | xx xx 16 | xx 00 xx 00 |
| **Length** | 3 Byte | xx Byte |
## 3.9 验证设备密码(0x1C)
| | Header | Password |
| --- | --- | --- |
| **Value(Hex)** | 00 07 1C | 31 32 33 34 35 36 |
| **Length** | 3 Byte | 6 Byte |
返回:
| | Header | Status |
| --- | --- | --- |
| **Value(Hex)** | 00 01 1C | 00/01 |
| **Length** | 3 Byte | 1 Byte |
> Status: 00 Success, 01 Failed
## 3.10 设置设备密码(0x1D)
| | Header | Old Password | New Password |
| --- | --- | --- | --- |
| **Value(Hex)** | 00 0D 1D | | |
| **Length** | 3 Byte | 6 Byte | 6 Byte |
返回:
| | Header | Status |
| --- | --- | --- |
| **Value(Hex)** | 00 02 1D | 00/01 |
| **Length** | 3 Byte | 1 Byte |
## 3.11 设备出厂初始化(0x1E)
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 01 1E | |
| **Length** | 3 Byte | 0Byte |
返回:
| | Header | Status |
| --- | --- | --- |
| **Value(Hex)** | 00 02 1E | 00/01 |
| **Length** | 3 Byte | 1 Byte |
## 3.12 设备复位(0x1F)
| | Header | Data |
| --- | --- | --- |
| **Value(Hex)** | 00 01 1F | |
| **Length** | 3 Byte | 0 Byte |
设备无回复。
## 3.13 设置车检器多路参数(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.14 读取车检器多路参数(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.15 设置主动上报(0xC5)
设置主动上报是否使能、类型、时长等。
| 7Fh | ADDR | Len | C5 | SensType(1Byte) | Enable(1Byte) | Interval(1Byte) | Timeout(1Byte) | XOR | SUM |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
> Enable: 是否使能第0位 0 禁用, 1 使能; 0x10表示只上报一次此时相当于查询功能第5位表示是否环境评估如0x21表示环境评估类型
> Interval: 当最高位为0时上报不需要确认低七位表示上报间隔0表示实时低七位非0表示以秒为单位的上报的间隔最高位为1时表示上报需要回复确认。
> Timeout: 单位分钟0表示没有时间限制。
## 3.16 设备主动上报传感信息(0xC0)
设备主动上报传感信息指令,具体传感数据需要根据不同的类型进行解析。
| 7Fh | ADDR | Len | C0 | SensType(1Byte) | SubPkgFlag(1Byte) | SensData | XOR | SUM |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
SensType: 传感数据类型
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, Directionfreq_type, sens | 线圈 1 配置<br>freq_level:高低频两个比特位00 表示高频(33nF),01表示中高(43nF), 10表示中低(66nF), 11表示低频(76nF)。<br>Direction: 0 表示触发1 表示方向判别<br>freq_type: 0 表示初始频率1 表示当前实时频率。<br>sens低四位表示当前的灵敏度等级 |
| 线圈评估条件 | 1 | condition, loop_state | 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 D2 00 00 00 00 00 00 00 00 00 00 52 00 00 00 00 00 00 00 00 00 00 92 00 00 00 00 00 00 00 00 00 00 D2 00 00 00 00 00 00 00 00 00 00 23 83`
**注意,如果有续包,最后一包上位机无返回**。中间续包上位机返回传感类型,当前收到包的序列和子包的数量:
| 7Fh | ADDR | 07 | C0 | SensType | Seq(1Byte) | SubAmount(1Byte) | XOR | SUM |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
---
# 修订记录
| 版本 | 修订时间 | 修订说明 | 修订人 |
| --- | --- | --- | --- |
| | | | |
| V1.00 | 2026-03-11 | 创建协议初始版本 | wangfq |
| V1.01 | 2026-06-22 | 补充遗漏的接口说明 | wangfq |