根因: 设置不同灵敏度感应高度无区别 1. unpack_pkg_set_mcjq_param 未同步 loop_SensLevel → 改灵敏度需重启才生效 2. 9级制映射 sensitvity & 0x03 折叠 (默认7→3, 3→3, 8→0) 3. (测试陷阱) 金属块过大信号饱和, 建议小金属块测临界高度 修复: - 提取 sens_level_from_config() 映射函数, 4级制 0~3 一一对应 (9级制后改) - unpack_pkg_set_mcjq_param 补 loop_SensLevel 同步 (运行中立即生效) - para_store_init 上电路径改用同一函数 - 协议 V1.08: Sensitivity 0~9级 → 4级制 0~3 (默认2) - tests/test_sens_mapping.c gcc 隔离单测 PASS (0~3无折叠/兼容旧默认7→3)
12 KiB
DLD960Loop 串口通信协议
1 通信说明
1.1 通信方式
串口通信,波特率:192000
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 Bytes:2Bytes)
当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/W,Amount, (Amount * (SensityIn + SensityOut)) | |
|---|---|---|
| Value(Hex) | ADDR xx 8A | xx |
| Length | 3 Byte | (1+ 1 + Amount *(2 + 2 ))Byte |
R/W: 1字节,0 Read, 1 Write
Amount:1字节,灵敏度值的数量, 当R/W为 Write时有效,最小3
SensityIn:两字节,触发灵敏度值,当R/W为 Write时有效
SensityOut:两字节,释放灵敏度值,当R/W为 Write时有效
返回
| Header | Ret,Amount, (Amount * (SensityIn + SensityOut)) | |
|---|---|---|
| Value(Hex) | ADDR xx 8A | xx |
| Length | 3 Byte | (1+ 1 + Amount *(2 + 2 ))Byte |
Ret: 0x10 | R/W,如果是读指令,返回0x10,如果是写指令,返回0x11。
7F 80 13 8A 10 04 A2 00 51 00 51 00 36 00 36 00 20 00 1C 00 12 00 81 2F
7F Magic Byte
80 Addr, 00/80 default
13 Len, 0x13=19字节(Cmd + Data)
8A Cmd
10 读指令返回
04 四级灵敏度(包括进入灵敏度 和 离开灵敏度,分别都是两个字节)
A2 00 51 00: 第0级灵敏度,0x00A2为进入 162,0x0051为离开 81
51 00 36 00:第1级灵敏度,0x0051为进入 81, 0x0036为离开 54
36 00 20 00:第2级灵敏度,0x0036为进入 54, 0x0020 为离开 32
1C 00 12 00:第3级灵敏度,0x001C为进入 28,0x0012 为离开 18
81 2F 校验码
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: 低四位表示灵敏度序号,4级制 0~3(0 最低,3 最高),默认 2;9级制灵敏度后续版本实现。高四位表示高低频,其中,[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:低四位表示当前的灵敏度等级(4级制 0~3,值越大越灵敏) |
| 线圈评估条件 | 1 | condition(4bit), loop_state(1bit), car_state(1bit), report_msic(2bit) |
loop_condition 正常(0)有效,环境状态条件(环境状态评估值,值越大,干扰越大),高四位有效。低四位中 ,其中第3位表示线圈状态,0 表示正常,1 表示线圈断开;第 2 位表示有无车,0 表示无车,1 表示有车;低两位表示杂项类型,0b00表示时间量,0b01表示线圈断开次数;0b10表示车流量数;0b11表示继电器输出次数 |
| 频率 1 | 3 | frequent | 低字节在前,无符号 |
| 变化量 1 | 3 | variation | 有符号 3 字节,低字节在前(小端),补码表示。定义 variation = loop_Origin − loop_CAPVD(基线 − 当前值)。正值表示当前值低于基线(车辆/金属进入,检测裕量方向);负值表示当前值高于基线(反向漂移/异常抬升)。值域 −8388608 ~ +8388607(−2²³ ~ +2²³−1,3B 补码标准值域),发送端已做饱和限幅,不会回绕。接收端解析:读入 3 字节后须做符号扩展—— v = b0|(b1<<8)|(b2<<16); if (v & 0x800000) v |= 0xFF000000; |
| 杂项 | 4 | in_out_passtime/cut_amount/flow_amount | 杂项类型,可能是时间量,也可能是线圈断开次数、车流量数,说明: 1、时间量有两种类型,通过时间或车间距,50ms 为单位(固件 50ms tick,TMR15 5ms×10 分频)。通过时间是从有车开始到车辆离开的时间(上报时car_state 为0);车间距是 从上一次车辆离开到有车时候的时间(上报时car_state 为1)。非0有效。 2、线圈断开次数。 3、车流量数。 4、继电器输出次数。 |
eg:
7F 00 33 C0 0C 00 12 00 2A 0F 01 07 00 00 00 00 00 00 D2 00 75 B7 00 01 00 00 00 00 00 00 12 00 EC 0C 01 02 00 00 00 00 00 00 92 00 83 C3 00 02 00 00 00 00 00 00 FE 38
指令解释
7F Magic Byte
00 Addr,0 default
33 Len, 0x33=51个字节(Cmd + Data)
C0 Cmd
0C SensType,传感数据类型,0x0C为 多线圈传感信息,960Loop为 四路线圈车检器,会有4个传感数据单元
00 SubPkgFlag,分包标记,00 表示无分包,是一条数据完整的记录。
(每路线圈单元 = 12 字节:config1(1) + eval(1) + freq(3) + variation(3, 有符号) + misc(4))
12 00 2A 0F 01 07 00 00 00 00 00 00:线圈1传感数据单元。0b00 高频,0b0 触发模式,0b1实时频率,0b0010 表示2级灵敏度;0b0000环境正常,0b0线圈正常,0b0当前无车,0b00 表示当前杂项参数为时间量;0x010F2A,频率为69418Hz;0x000007,变化量为 +7(当前值低于基线,正常裕量);0x00000000,时间量为0
D2 00 75 B7 00 01 00 00 00 00 00 00:线圈2传感数据单元。0b11 低频,0b0 触发模式,0b1实时频率,0b0010 表示2级灵敏度;0b0000环境正常,0b0线圈正常,0b0当前无车,0b00 表示当前杂项参数为时间量;0x00B775,频率为46965Hz;0x000001,变化量为 +1;0x00000000,时间量为0
12 00 EC 0C 01 02 00 00 00 00 00 00:线圈3传感数据单元。0b00 高频,0b0 触发模式,0b1实时频率,0b0010 表示2级灵敏度;0b0000环境正常,0b0线圈正常,0b0当前无车,0b00 表示当前杂项参数为时间量;0x010CEC,频率为68844Hz;0x000002,变化量为 +2;0x00000000,时间量为0
92 00 83 C3 00 02 00 00 00 00 00 00:线圈4传感数据单元。0b10 中低,0b0 触发模式,0b1实时频率,0b0010 表示2级灵敏度;0b0000环境正常,0b0线圈正常,0b0当前无车,0b00 表示当前杂项参数为时间量;0x00C383,频率为50051Hz;0x000002,变化量为 +2;0x00000000,时间量为0
FE 38 校验字节(XOR=0xFE, SUM=0x38)
# 变化量为有符号 3 字节小端补码。若某通道 variation 三字节为 F6 FF FF,
# 符号扩展后 = 0xFFFFFFF6 = -10,表示当前值高于基线 10(反向漂移/异常抬升)。
注意,如果有续包,最后一包上位机无返回。中间续包上位机返回传感类型,当前收到包的序列和子包的数量:
| 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 |
| V1.03 | 2026-07-02 | 0x8A 响应格式 + LEN 计算修正 | wangfq |
| V1.04 | 2026-07-02 | 主动上报增加继电器输出次数 类型 | wangfq |
| V1.05 | 2026-07-14 | 多线圈上报(0x0C)变化量 variation 由 2 字节无符号扩展为 3 字节有符号(补码, 小端),定义 variation = Origin − CAPVD(正=车/裕量, 负=反向漂移);每单元 11→12 字节,Len 47→51。接收端须做符号扩展。Loop 固件与 DBN 固件须同版本发布。 |
wangfq |
| V1.06 | 2026-07-15 | 修正杂项时间量单位说明:5ms → 50ms(对齐固件 50ms tick 实现,TMR15 5ms×10 分频) | wangfq |
| V1.07 | 2026-08-25 | variation 值域表述勘误:±8388607 → −8388608 ~ +8388607(对齐代码负向饱和边界 0x800000,3B 补码标准值域) |
wangfq |
| V1.08 | 2026-08-25 | 灵敏度收敛为 4级制 0~3(0 最低,3 最高,默认 2):修复 9级制映射 &0x03 折叠(7→3、8→0 错乱)导致"改灵敏度感应高度无区别";运行中配置灵敏度立即生效(不再依赖重启)。9级制后续版本实现 |
wangfq |