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 24b94d4..bff10e0 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -33,6 +33,8 @@ static uint32_t last_query_tick = 0; static uint32_t feed_start_tick = 0; /* 投喂开始时刻,用于超时保护 */ static uint8_t first_query_sent = 0; /* 首次上电查询已发送 */ static uint32_t await_reply_tick = 0; /* 查询发出时刻,0=无等待中的查询 */ +static uint8_t query_retried = 0; /* 本次查询已补发过 */ +static uint8_t await_bad_frame = 0; /* 等待期间收到过坏帧(帧头被切/校验错) */ static uint8_t first_query_reported = 0; /* 首次上电有效重量已上报 */ /* 重量异常增加计数 */ @@ -398,21 +400,32 @@ void feedScaleProcess(void) } } - /* 查询发出后 1s 仍无任何应答帧:打日志(有无应答一目了然) */ - if (await_reply_tick && (HAL_GetTick() - await_reply_tick) > 1000u) { - await_reply_tick = 0; - log_warn("> FEED: 查询无应答(秤未接/线序/波特率/站号不对)"); - s_last_err = 1; + /* 应答监视:400ms 无好帧(或收到坏帧)→ 自动补发一次; + * 补发后 600ms 仍不行才报无应答(坏帧原因 parse 已打,不再重复) */ + if (await_reply_tick) { + uint32_t el = HAL_GetTick() - await_reply_tick; + if (!query_retried && (el > 400u || (await_bad_frame && el > 100u))) { + query_retried = 1; + await_bad_frame = 0; + await_reply_tick = HAL_GetTick(); + log_info("> FEED: 应答异常,补发查询"); + feed_scale_send_query(); + } else if (query_retried && el > 600u) { + await_reply_tick = 0; + if (!await_bad_frame) { + log_warn("> FEED: 查询无应答(秤未接/线序/波特率/站号不对)"); + s_last_err = 1; + } + await_bad_frame = 0; + } } /* 读取 485 返回 */ len = feed_scale_read_frame(rx_buf, sizeof(rx_buf)); if (len > 0) { - if (!(len == sizeof(RS485_WEIGHT_CMD) && - memcmp(rx_buf, RS485_WEIGHT_CMD, sizeof(RS485_WEIGHT_CMD)) == 0)) { - await_reply_tick = 0; /* 收到非回声帧:本次查询有应答 */ - } int prc = feed_scale_parse_weight(rx_buf, len, &cur_weight); + if (prc == 0) { await_reply_tick = 0; query_retried = 0; await_bad_frame = 0; } + else if (prc != -7) { await_bad_frame = 1; } /* 坏帧:触发补发 */ if (prc != -7) { /* -7=回声帧:不影响状态显示 */ s_last_err = (prc == 0) ? 0 : (prc == -1 ? 2 : (prc == -2 ? 3 : (prc == -4 ? 4 : (prc == -6 ? 6 : 5)))); } diff --git a/V1.5/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx b/V1.5/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx index 7ae1993..bdcee19 100644 --- a/V1.5/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx +++ b/V1.5/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx @@ -647,7 +647,7 @@ HardWare - 1 + 0 0 0 0 diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index 419ca18..fcf25a2 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -193,3 +193,5 @@ - 鏍规不 485 鎺ユ敹鍋滄憜锛欻AL 澶勭悊 ORE 閿欒鍚 RxState 甯稿崱 BUSY_RX锛岃嚜鎰堥噷鐨 Receive_IT 闈欓粯澶辫触 鈫 閿欒鍥炶皟閲嶆寕鍓嶅己鍒 RxState=READY锛涙煡璇㈠墠娓呯紦鍐叉椂椤哄甫妫鏌ユ帴鏀朵腑鏂槸鍚﹀仠鎽嗗苟鎷夎捣锛堜笉 Abort锛 USART1/USART5 鑷剤鍚屾牱鍔犲浐 +- 485 涓㈠抚鏍瑰洜瀹氫綅骞跺姞鍥猴細涓婁綅鏈虹鍥炴椂鍥炲甯уご琚 485 鏀跺彂鍣ㄥ垏鎹㈠欢杩熷垏鎺夛紙鐪熺Г鏈夊鐞嗗欢杩熶笉鍙楀奖鍝嶏級锛 + 鐜 400ms 鏃犲ソ甯ф垨鏀跺埌鍧忓抚鑷姩琛ュ彂涓娆℃煡璇紝浠嶄笉琛屾墠鎶ユ棤搴旂瓟