V1.5: 新增ver版本字符串上报(每次重启联网一次);485秤收帧hex打印+解析失败原因明细
This commit is contained in:
parent
80c87e019f
commit
2cb8846136
|
|
@ -64,18 +64,43 @@ static uint16_t crc16_modbus(const uint8_t *data, uint16_t len)
|
|||
return crc;
|
||||
}
|
||||
|
||||
/* 485 原始帧 hex 打印(排查用:收到什么先原样打出来) */
|
||||
static void feed_scale_dump_frame(const uint8_t *buf, uint16_t len)
|
||||
{
|
||||
char hex[3 * 24 + 1] = {0};
|
||||
uint16_t n = len > 24 ? 24 : len;
|
||||
for (uint16_t i = 0; i < n; i++) {
|
||||
snprintf(hex + i * 3, 4, "%02X ", buf[i]);
|
||||
}
|
||||
log_info("> FEED: 485 收到 %d 字节: %s", (int)len, hex);
|
||||
}
|
||||
|
||||
/* 从 485 应答中解析重量,应答 9 字节: 01 03 04 41 97 30 33 0B F6 */
|
||||
static int feed_scale_parse_weight(const uint8_t *buf, uint16_t len, uint16_t *weight_100g)
|
||||
{
|
||||
feed_scale_dump_frame(buf, len);
|
||||
|
||||
if (len < 9) {
|
||||
log_warn("> FEED: 485 帧长度过短, len=%d", (int)len);
|
||||
log_warn("> FEED: 解析失败-帧长度过短(%d<9),可能波特率不对或线路干扰", (int)len);
|
||||
return -1;
|
||||
}
|
||||
if (buf[0] != RS485_WEIGHT_CMD[0]) {
|
||||
log_warn("> FEED: 解析失败-站号不符(收0x%02X 期望0x%02X)", buf[0], RS485_WEIGHT_CMD[0]);
|
||||
return -3;
|
||||
}
|
||||
if (buf[1] == (RS485_WEIGHT_CMD[1] | 0x80)) {
|
||||
log_warn("> FEED: 解析失败-秤返回异常帧(功能码0x%02X 异常码0x%02X),寄存器地址/数量不对?", buf[1], buf[2]);
|
||||
return -4;
|
||||
}
|
||||
if (buf[1] != RS485_WEIGHT_CMD[1]) {
|
||||
log_warn("> FEED: 解析失败-功能码不符(收0x%02X 期望0x%02X)", buf[1], RS485_WEIGHT_CMD[1]);
|
||||
return -5;
|
||||
}
|
||||
|
||||
uint16_t calc_crc = crc16_modbus(buf, 7); /* 前 7 字节参与 CRC 计算 */
|
||||
uint16_t recv_crc = (uint16_t)buf[8] << 8 | buf[7]; /* 最后两字节为 CRC */
|
||||
if (calc_crc != recv_crc) {
|
||||
log_warn("> FEED: 485 CRC 校验错误, calc=0x%04X recv=0x%04X", calc_crc, recv_crc);
|
||||
log_warn("> FEED: 解析失败-CRC 校验错误(calc=0x%04X recv=0x%04X),可能字节序/帧边界错位或干扰", calc_crc, recv_crc);
|
||||
return -2;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -317,6 +317,23 @@ void NET_publish_response(const char *cmd_id, int ok, const char *msg)
|
|||
net_at_unlock();
|
||||
}
|
||||
|
||||
/* 上报代码版本字符串: ver 字段,内容即 FIRMWARE_VERSION_STR(每次联网成功报一次) */
|
||||
void NET_publish_version(const char *ver)
|
||||
{
|
||||
if (g_net_tx_busy) { log_info("> NET: 版本上报被丢弃 (发送忙)"); return; }
|
||||
if (net_at_trylock() != 0) { log_info("> NET: 版本上报被丢弃 (AT 忙)"); return; }
|
||||
if (s_backend == NET_BACKEND_4G) {
|
||||
CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22ver\\22:\\22%s\\22}}\"",
|
||||
MqttInfoStr.ClientID, ver);
|
||||
} else {
|
||||
char json[96];
|
||||
snprintf(json, sizeof(json),
|
||||
"{\"header\":\"iot.prop.post\",\"body\":{\"ver\":\"%s\"}}", ver);
|
||||
net_wifi_publish_up(json);
|
||||
}
|
||||
net_at_unlock();
|
||||
}
|
||||
|
||||
/* 上报电量状态: on=1 正常, on=0 低电量。返回 0=已发出,-1=通道忙被丢弃 */
|
||||
int NET_publish_power(int on)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -52,7 +52,8 @@ net_backend_t NET_GetActiveBackend(void);
|
|||
void NET_publish_status(int sw1, int feeding, int sw2, int sw3, int sw4,
|
||||
float weight_kg, float once_wt_kg, float zero_kg);
|
||||
void NET_publish_response(const char *cmd_id, int ok, const char *msg);
|
||||
int NET_publish_power(int on); /* 返回 0=已发出,-1=通道忙被丢弃 */
|
||||
int NET_publish_power(int on);
|
||||
void NET_publish_version(const char *ver); /* 上报代码版本字符串(FIRMWARE_VERSION_STR) */ /* 返回 0=已发出,-1=通道忙被丢弃 */
|
||||
void NET_publish_energy(float kwh); /* 上报累计电量,标识符 energy,单位 kWh */
|
||||
int NET_mqtt_report(const char *header, const char *ota_id, int val); /* 返回 0=送达 */
|
||||
int NET_ota_confirm(void); /* 0=确认通知已送达 1=无挂起 -1=未送达(需重试) */
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ static void app_task(void *arg)
|
|||
mqtt_first_status_reported = 1;
|
||||
relayRestoreState();
|
||||
relayStatueUpdata();
|
||||
NET_publish_version(FIRMWARE_VERSION_STR); /* 每次重启联网后上报一次代码版本 */
|
||||
log_info("> Main: MQTT Ready 后首次状态上报");
|
||||
ota_confirm_tick = HAL_GetTick();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -345,6 +345,7 @@ W25Q64 外部 Flash(8MB):
|
|||
| `pow` | 电量状态 | 1=正常,0=低电量 |
|
||||
| `energy` | 累计消耗电量 | HLW8032 计量,单位 kWh,两位小数(>10W 每 30s,否则首次+开关切换) |
|
||||
| `iccid` | SIM 卡号 | 仅 4G 通道,MQTT 连上后随 pow 上报一次,用于物联网卡套餐查询缴费 |
|
||||
| `ver` | 代码版本字符串 | 即 `FIRMWARE_VERSION_STR`(如 "1.5.0"),字符串类型,每次重启联网后上报一次。注意与状态大报文中的整数 `ver`(OTA 版本号)同名,平台需注意解析 |
|
||||
| `GPS` | 定位坐标 | 仅 4G 通道(Air780EG),GCJ-02 高德坐标系,格式 `"经度,纬度"`,每 5 分钟上报 |
|
||||
|
||||
> 注:`zero`(剩余料重)与 `onceWt` 为称重模式专用字段——`PRODUCT_WITH_FEED_SCALE=0` 时状态上报不携带这两个字段,平台下发设置会收到 `no scale on this device` 拒绝应答。
|
||||
|
|
|
|||
|
|
@ -147,3 +147,6 @@
|
|||
标记原因(RSN_OTA_FAIL "OTA失败中止")并主动复位,重启走干净 4G 初始化恢复联网
|
||||
- 修复 OTA 的 SAPBR 激活承载概率性失败:OTA 入口复位模组后未等网络重新附着(CATT)就
|
||||
激活承载,注册慢时必失败。现 CSQ 后加 cat_wait_cgatt_attached(30),附着成功才走 SAPBR
|
||||
- 新增代码版本上报:标识符 ver(字符串,内容=FIRMWARE_VERSION_STR),每次重启联网后上报一次
|
||||
- 485 秤调试日志增强:收到帧先打印原始 hex,解析失败输出具体原因
|
||||
(帧过短/站号不符/异常帧/功能码不符/CRC 错误各带说明)
|
||||
|
|
|
|||
Loading…
Reference in New Issue