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=姝e父锛0=浣庣數閲 | | `energy` | 绱娑堣楃數閲 | HLW8032 璁¢噺锛屽崟浣 kWh锛屼袱浣嶅皬鏁帮紙>10W 姣 30s锛屽惁鍒欓娆+寮鍏冲垏鎹級 | | `iccid` | SIM 鍗″彿 | 浠 4G 閫氶亾锛孧QTT 杩炰笂鍚庨殢 pow 涓婃姤涓娆★紝鐢ㄤ簬鐗╄仈缃戝崱濂楅鏌ヨ缂磋垂 | +| `ver` | 浠g爜鐗堟湰瀛楃涓 | 鍗 `FIRMWARE_VERSION_STR`锛堝 "1.5.0"锛夛紝瀛楃涓茬被鍨嬶紝姣忔閲嶅惎鑱旂綉鍚庝笂鎶ヤ竴娆°傛敞鎰忎笌鐘舵佸ぇ鎶ユ枃涓殑鏁存暟 `ver`锛圤TA 鐗堟湰鍙凤級鍚屽悕锛屽钩鍙伴渶娉ㄦ剰瑙f瀽 | | `GPS` | 瀹氫綅鍧愭爣 | 浠 4G 閫氶亾(Air780EG)锛孏CJ-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 +- 鏂板浠g爜鐗堟湰涓婃姤锛氭爣璇嗙 ver锛堝瓧绗︿覆锛屽唴瀹=FIRMWARE_VERSION_STR锛夛紝姣忔閲嶅惎鑱旂綉鍚庝笂鎶ヤ竴娆 +- 485 绉よ皟璇曟棩蹇楀寮猴細鏀跺埌甯у厛鎵撳嵃鍘熷 hex锛岃В鏋愬け璐ヨ緭鍑哄叿浣撳師鍥 + 锛堝抚杩囩煭/绔欏彿涓嶇/寮傚父甯/鍔熻兘鐮佷笉绗/CRC 閿欒鍚勫甫璇存槑锛