fix: 同步协议文档 V1.03 — 0x8A 响应格式 + LEN 计算修正

协议变更(V1.02→V1.03):
- 0x8A 响应: Ret(0x10/0x11) + Amount + Amount*(SensIn+SensOut)
- 新增灵敏度响应例程 (7F 80 13 8A 10 04 ...)
- 波特率确认 192000

代码修正:
- lup_build_sensitivity_read:  LEN=3 (was 4)
- lup_build_sensitivity_write: LEN=3+Amount*4 (was 2+Amount*2)
- lup_parse_sensitivity_resp: 解析 Ret 字节 + SensIn/SensOut 双值
- lup_build_set_param:        LEN=3+5*Amount (was 2+5*Amount)
- tcp_json_srv:               JSON 输出含 sens_in/sens_out 字段
This commit is contained in:
wangfq
2026-07-02 11:55:29 +08:00
parent eb7419b3e8
commit 615b369690
3 changed files with 66 additions and 42 deletions

View File

@@ -150,23 +150,19 @@ uint16_t lup_build_factory_init(uint8_t *buf)
/*
* 0x8A — 读灵敏度列表
* Req: 7F 00 04 8A 00 00 ...
* Req: 7F 00 03 8A 00 00 xx xx
* LEN=3: CMD(1) + R/W(1) + Amount(1)
*/
uint16_t lup_build_sensitivity_read(uint8_t *buf)
{
buf[0] = LUP_MAGIC;
buf[1] = LUP_ADDR_DEFAULT;
buf[2] = 0x04; // LEN = 4 (CMD + R/W + Amount + reserved?)
buf[2] = 0x03; // LEN = 3 (CMD + R/W + Amount)
buf[3] = LUP_CMD_SENSITIVITY; // 0x8A
// Value: R/W + Amount (2 bytes, all zeros for read)
// 协议说 R/W: 1 byte, Amount: 1 byte, 后面是 Amount * (SensityIn + SensityOut)
// 对于 Read: R/W=0, Amount 忽略
buf[4] = LUP_SENS_RW_READ;
buf[4] = LUP_SENS_RW_READ; // 0x00
buf[5] = 0x00; // Amount (ignored for read)
buf[6] = 0x00; // padding?
buf[7] = 0x00; // padding?
lup_append_checksum(buf);
return 10; // Magic(1)+Header(3)+Value(4)+Check(2)
return 5 + buf[2]; // = 8
}
/*
@@ -179,8 +175,9 @@ uint16_t lup_build_sensitivity_write(uint8_t *buf, const LUP_Sensitivity *sens)
buf[idx++] = LUP_MAGIC;
buf[idx++] = LUP_ADDR_DEFAULT;
// LEN field: 2 + 2*sens->amount
uint8_t val_len = 2 + 2 * sens->amount;
// LEN = CMD(1) + R/W(1) + Amount(1) + Amount*(SensIn(2)+SensOut(2))
// = 3 + sens->amount * 4
uint8_t val_len = 3 + sens->amount * 4;
buf[idx++] = val_len;
buf[idx++] = LUP_CMD_SENSITIVITY;
@@ -194,12 +191,13 @@ uint16_t lup_build_sensitivity_write(uint8_t *buf, const LUP_Sensitivity *sens)
buf[idx++] = (uint8_t)((sens->sens_out[i] >> 8) & 0xFF);
}
lup_append_checksum(buf);
return idx + 2; // +2 for checksum bytes
return 5 + val_len; // Magic(1)+Addr(1)+LEN(1)+Value(val_len)+Check(2)
}
/*
* 0x63 — 设置多路参数
* Value: AutoMode(1) + Amount(1) + Amount*(Param[5])
* Value: AutoMode(1) + Amount(1) + Amount * Param[5]
* LEN = CMD(1) + AutoMode(1) + Amount(1) + Amount*5 = 3 + 5*Amount
*/
uint16_t lup_build_set_param(uint8_t *buf, const LUP_ParamSet *ps)
{
@@ -208,8 +206,7 @@ uint16_t lup_build_set_param(uint8_t *buf, const LUP_ParamSet *ps)
buf[idx++] = LUP_MAGIC;
buf[idx++] = LUP_ADDR_DEFAULT;
// LEN = 2 + 5 * Amount
uint8_t val_len = 2 + 5 * ps->amount;
uint8_t val_len = 3 + 5 * ps->amount; // CMD + AutoMode + Amount + Amount*Param
buf[idx++] = val_len;
buf[idx++] = LUP_CMD_SET_PARAM;
@@ -224,7 +221,7 @@ uint16_t lup_build_set_param(uint8_t *buf, const LUP_ParamSet *ps)
buf[idx++] = ps->params[i].direction_mode;
}
lup_append_checksum(buf);
return idx + 2;
return 5 + val_len; // Magic(1)+Addr(1)+LEN(1)+Value(val_len)+Check(2)
}
/*
@@ -305,26 +302,28 @@ int lup_parse_factory_init_resp(const uint8_t *pkg, uint16_t len, uint8_t *succe
/*
* Parse 0x8A Response:
* Value: Amount (1byte) + Amount * SensityValue (2bytes each)
* Value: Ret(1) + Amount(1) + Amount*(SensIn(2) + SensOut(2))
* Ret = 0x10 (Read return) | 0x11 (Write return)
*
* eg: 7F 80 13 8A 10 04 A2 00 51 00 51 00 36 00 ...
* Ret=0x10=Read, Amount=4
* Lv0: SensIn=0x00A2, SensOut=0x0051
*/
int lup_parse_sensitivity_resp(const uint8_t *pkg, uint16_t len, LUP_Sensitivity *sens)
{
uint8_t i;
if (len < 6) return -1;
if (len < 8) return -1; // min: 7F+Addr+LEN+CMD+Ret+Amount+XOR+SUM = 8
if (pkg[0] != LUP_MAGIC || pkg[3] != LUP_CMD_SENSITIVITY) return -2;
const uint8_t *val = pkg + 4;
uint8_t amount = val[0];
sens->rw = val[0]; // 0x10 or 0x11
sens->amount = val[1];
if (amount > LUP_COIL_COUNT) amount = LUP_COIL_COUNT;
sens->amount = amount;
sens->rw = 0; // response, not request
if (sens->amount > LUP_COIL_COUNT) sens->amount = LUP_COIL_COUNT;
for (i = 0; i < amount; i++) {
uint16_t sv = val[1 + i * 2] | ((uint16_t)val[2 + i * 2] << 8);
// Response returns unified SensityValue (not split in/out)
sens->sens_in[i] = sv;
sens->sens_out[i] = sv;
for (i = 0; i < sens->amount; i++) {
sens->sens_in[i] = val[2 + i * 4] | ((uint16_t)val[3 + i * 4] << 8);
sens->sens_out[i] = val[4 + i * 4] | ((uint16_t)val[5 + i * 4] << 8);
}
return 0;
}

View File

@@ -992,16 +992,20 @@ static void json_check_pending(void) {
memset(&sens, 0, sizeof(sens));
int ret = lup_parse_sensitivity_resp(g_lup_cmd.resp_buf, g_lup_cmd.resp_len, &sens);
if (ret == 0) {
char data_json[512];
char data_json[1024];
char *p = data_json;
int rem = sizeof(data_json);
int w = snprintf(p, rem, "{\"amount\":%d,\"channels\":[", sens.amount);
int w = snprintf(p, rem,
"{\"ret\":\"%s\",\"amount\":%d,\"channels\":[",
(sens.rw == 0x10) ? "read" : (sens.rw == 0x11) ? "write" : "?",
sens.amount);
p += w; rem -= w;
uint8_t i;
for (i = 0; i < sens.amount; i++) {
w = snprintf(p, rem,
"%s{\"ch\":%d,\"sens_value\":%d}",
(i > 0) ? "," : "", i + 1, sens.sens_in[i]);
"%s{\"ch\":%d,\"sens_in\":%d,\"sens_out\":%d}",
(i > 0) ? "," : "", i + 1,
sens.sens_in[i], sens.sens_out[i]);
p += w; rem -= w;
}
snprintf(p, rem, "]}");
@@ -1013,21 +1017,24 @@ static void json_check_pending(void) {
"Failed to parse sensitivity");
}
} else if (strcmp(g_json_pending.cmd, "loop_sens_write") == 0) {
// 0x8A Write response returns sensitivity list
LUP_Sensitivity sens;
memset(&sens, 0, sizeof(sens));
int ret = lup_parse_sensitivity_resp(g_lup_cmd.resp_buf, g_lup_cmd.resp_len, &sens);
if (ret == 0) {
char data_json[512];
char data_json[1024];
char *p = data_json;
int rem = sizeof(data_json);
int w = snprintf(p, rem, "{\"amount\":%d,\"channels\":[", sens.amount);
int w = snprintf(p, rem,
"{\"ret\":\"%s\",\"amount\":%d,\"channels\":[",
(sens.rw == 0x10) ? "read" : (sens.rw == 0x11) ? "write" : "?",
sens.amount);
p += w; rem -= w;
uint8_t i;
for (i = 0; i < sens.amount; i++) {
w = snprintf(p, rem,
"%s{\"ch\":%d,\"sens_value\":%d}",
(i > 0) ? "," : "", i + 1, sens.sens_in[i]);
"%s{\"ch\":%d,\"sens_in\":%d,\"sens_out\":%d}",
(i > 0) ? "," : "", i + 1,
sens.sens_in[i], sens.sens_out[i]);
p += w; rem -= w;
}
snprintf(p, rem, "]}");

View File

@@ -4,7 +4,7 @@
## 1.1 通信方式
串口通信波特率115200
串口通信波特率192000
# 2 协议格式
@@ -102,8 +102,8 @@ Package
| | Header | R/WAmount Amount \* (SensityIn + SensityOut) |
| --- | --- | --- |
| **Value(Hex)** | 00 04 8A | xx |
| **Length** | 3 Byte | (2 + 2\*x )Byte |
| **Value(Hex)** | ADDR xx 8A | xx |
| **Length** | 3 Byte | (1+ 1 + Amount \*(2 + 2 ))Byte |
> R/W: 1字节0 Read 1 Write
@@ -115,10 +115,28 @@ Package
返回
| | Header | Amount,  Amount \* SensityValue |
| | Header | RetAmount,  Amount \* (SensityIn + SensityOut) |
| --- | --- | --- |
| **Value(Hex)** | ADDR 03 8A | xx |
| **Length** | 3 Byte | (1 + 2\*x) Byte |
| **Value(Hex)** | ADDR xx 8A | xx |
| **Length** | 3 Byte | (1+ 1 + Amount \*(2 + 2 ))Byte |
> Ret: 0x10 | R/W如果是读指令返回0x10如果是写指令返回0x11。
```python
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为进入 1620x0051为离开 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为进入 280x0012 为离开 18
81 2F 校验码
```
## 3.05 设置车检器多路参数(0x63)