V1.5: 485应答异常自动补发一次查询(400ms无好帧或收到坏帧),对抗收发器切换切帧头

This commit is contained in:
helei 2026-08-22 12:56:35 +08:00
parent eb2b27ddbc
commit 05700826d1
3 changed files with 25 additions and 10 deletions

View File

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

View File

@ -647,7 +647,7 @@
<Group>
<GroupName>HardWare</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>

View File

@ -193,3 +193,5 @@
- 根治 485 接收停摆HAL 处理 ORE 错误后 RxState 常卡 BUSY_RX自愈里的 Receive_IT 静默失败
→ 错误回调重挂前强制 RxState=READY查询前清缓冲时顺带检查接收中断是否停摆并拉起不 Abort
USART1/USART5 自愈同样加固
- 485 丢帧根因定位并加固:上位机秒回时回复帧头被 485 收发器切换延迟切掉(真秤有处理延迟不受影响);
现 400ms 无好帧或收到坏帧自动补发一次查询,仍不行才报无应答