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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user