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;
}