V1.5: 新增ver版本字符串上报(每次重启联网一次);485秤收帧hex打印+解析失败原因明细

This commit is contained in:
helei 2026-08-18 16:33:49 +08:00
parent 80c87e019f
commit 2cb8846136
6 changed files with 51 additions and 3 deletions

View File

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

View File

@ -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)
{

View File

@ -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=未送达(需重试) */

View File

@ -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();
}

View File

@ -345,6 +345,7 @@ W25Q64 外部 Flash8MB
| `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` 拒绝应答。

View File

@ -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 错误各带说明)