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 3dc6f4c..8fd2725 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -80,6 +80,23 @@ static int feed_scale_parse_weight(const uint8_t *buf, uint16_t len, uint16_t *w { feed_scale_dump_frame(buf, len); + /* 定位应答帧头(站号+03+字节数04):485 回声或前导垃圾可能混在帧头前面 */ + int hdr = -1; + for (int i = 0; i + 8 < len; i++) { + if (buf[i] == RS485_WEIGHT_CMD[0] && buf[i+1] == 0x03 && buf[i+2] == 0x04) { + hdr = i; + break; + } + } + if (hdr > 0) { + log_info("> FEED: 跳过前导 %d 字节(回声/干扰)", hdr); + buf += hdr; + len -= hdr; + } else if (hdr < 0 && len >= 9) { + log_warn("> FEED: 解析失败-找不到帧头 01 03 04"); + return -6; + } + if (len < 9) { log_warn("> FEED: 解析失败-帧长度过短(%d<9),可能波特率不对或线路干扰", (int)len); return -1; @@ -126,6 +143,8 @@ static void feed_scale_send_query(void) { USART2_ForceRxReset(); /* 清缓冲+重挂接收,防止前次残留状态吞掉本次应答 */ HAL_UART_Transmit(&huart2, (uint8_t *)RS485_WEIGHT_CMD, sizeof(RS485_WEIGHT_CMD), 100); + HAL_Delay(5); /* 等 485 回声(自己 TX 被 RX 听到)收尾 */ + USART2_ForceRxReset(); /* 清掉回声,应答帧从干净状态开始 */ } /* 读取 485 返回帧 */ diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index b22a06e..57eded1 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -182,3 +182,5 @@ - 鍘绘帀 OLED 闃茬儳灞忓乏鍙冲亸绉伙紙鏂數宸插叧灞忥紝鍋忕Щ鎰忎箟涓嶅ぇ锛 - 淇 485 棣栨搴旂瓟涓㈠け锛歎SART2 鎺ユ敹鍙兘鍥 ORE 娈嬬暀鐘舵佸崱姝伙紙鑷剤閲嶆寕鍥 RxState 闈 READY 闈欓粯澶辫触锛夛紝 鐜版瘡娆℃煡璇㈠墠 USART2_ForceRxReset() 寮哄埗澶嶄綅鎺ユ敹锛堟竻閿欒/缂撳啿+閲嶆寕涓柇锛夛紝棣栧寘涓嶅啀涓 +- 淇 485 鍥炲0鍚冨簲绛斿抚澶达細鏌ヨ TX 鍚庣瓑 5ms 娓呭洖澹扮紦鍐诧紱瑙f瀽鏃舵敼涓哄湪甯у唴瀹氫綅 01 03 04 甯уご锛 + 鎶楀洖澹/鍓嶅鍨冨溇锛堝揩閫熷簲绛斾笉鍐嶈鍚炲墠鍑犱釜瀛楄妭锛