From 2cb8846136d280f401fd436227d25d2c054cb172 Mon Sep 17 00:00:00 2001 From: helei Date: Tue, 18 Aug 2026 16:33:49 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20=E6=96=B0=E5=A2=9Ever=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E4=B8=8A=E6=8A=A5(=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E9=87=8D=E5=90=AF=E8=81=94=E7=BD=91=E4=B8=80=E6=AC=A1?= =?UTF-8?q?);485=E7=A7=A4=E6=94=B6=E5=B8=A7hex=E6=89=93=E5=8D=B0+=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=A4=B1=E8=B4=A5=E5=8E=9F=E5=9B=A0=E6=98=8E=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HardWare/FEED_SCALE/feed_scale.c | 29 +++++++++++++++++-- .../STM32F103_App1/HardWare/NETWORK/network.c | 17 +++++++++++ .../STM32F103_App1/HardWare/NETWORK/network.h | 3 +- .../HardWare/SYSINIT/app_loop.c | 1 + V1.5/STM32F103_App1/README.md | 1 + V1.5/版本说明.md | 3 ++ 6 files changed, 51 insertions(+), 3 deletions(-) diff --git a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c index 77c455e..5c91ae9 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -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; } diff --git a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c index accb313..dd031b5 100644 --- a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c +++ b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c @@ -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) { diff --git a/V1.5/STM32F103_App1/HardWare/NETWORK/network.h b/V1.5/STM32F103_App1/HardWare/NETWORK/network.h index 9ec3495..e7bd252 100644 --- a/V1.5/STM32F103_App1/HardWare/NETWORK/network.h +++ b/V1.5/STM32F103_App1/HardWare/NETWORK/network.h @@ -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=δʹ() */ diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c index 9fd9444..d8f9c15 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -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(); } diff --git a/V1.5/STM32F103_App1/README.md b/V1.5/STM32F103_App1/README.md index b5a49ff..3ed8357 100644 --- a/V1.5/STM32F103_App1/README.md +++ b/V1.5/STM32F103_App1/README.md @@ -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` 拒绝应答。 diff --git a/V1.5/版本说明.md b/V1.5/版本说明.md index 75b7d03..83badd6 100644 --- a/V1.5/版本说明.md +++ b/V1.5/版本说明.md @@ -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 错误各带说明)