V1.5: 485应答异常自动补发一次查询(400ms无好帧或收到坏帧),对抗收发器切换切帧头
This commit is contained in:
parent
eb2b27ddbc
commit
05700826d1
|
|
@ -33,6 +33,8 @@ static uint32_t last_query_tick = 0;
|
||||||
static uint32_t feed_start_tick = 0; /* 投喂开始时刻,用于超时保护 */
|
static uint32_t feed_start_tick = 0; /* 投喂开始时刻,用于超时保护 */
|
||||||
static uint8_t first_query_sent = 0; /* 首次上电查询已发送 */
|
static uint8_t first_query_sent = 0; /* 首次上电查询已发送 */
|
||||||
static uint32_t await_reply_tick = 0; /* 查询发出时刻,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; /* 首次上电有效重量已上报 */
|
static uint8_t first_query_reported = 0; /* 首次上电有效重量已上报 */
|
||||||
|
|
||||||
/* 重量异常增加计数 */
|
/* 重量异常增加计数 */
|
||||||
|
|
@ -398,21 +400,32 @@ void feedScaleProcess(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 查询发出后 1s 仍无任何应答帧:打日志(有无应答一目了然) */
|
/* 应答监视:400ms 无好帧(或收到坏帧)→ 自动补发一次;
|
||||||
if (await_reply_tick && (HAL_GetTick() - await_reply_tick) > 1000u) {
|
* 补发后 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;
|
await_reply_tick = 0;
|
||||||
|
if (!await_bad_frame) {
|
||||||
log_warn("> FEED: 查询无应答(秤未接/线序/波特率/站号不对)");
|
log_warn("> FEED: 查询无应答(秤未接/线序/波特率/站号不对)");
|
||||||
s_last_err = 1;
|
s_last_err = 1;
|
||||||
}
|
}
|
||||||
|
await_bad_frame = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* 读取 485 返回 */
|
/* 读取 485 返回 */
|
||||||
len = feed_scale_read_frame(rx_buf, sizeof(rx_buf));
|
len = feed_scale_read_frame(rx_buf, sizeof(rx_buf));
|
||||||
if (len > 0) {
|
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);
|
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=回声帧:不影响状态显示 */
|
if (prc != -7) { /* -7=回声帧:不影响状态显示 */
|
||||||
s_last_err = (prc == 0) ? 0 : (prc == -1 ? 2 : (prc == -2 ? 3 : (prc == -4 ? 4 : (prc == -6 ? 6 : 5))));
|
s_last_err = (prc == 0) ? 0 : (prc == -1 ? 2 : (prc == -2 ? 3 : (prc == -4 ? 4 : (prc == -6 ? 6 : 5))));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -647,7 +647,7 @@
|
||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>HardWare</GroupName>
|
<GroupName>HardWare</GroupName>
|
||||||
<tvExp>1</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
|
|
||||||
|
|
@ -193,3 +193,5 @@
|
||||||
- 根治 485 接收停摆:HAL 处理 ORE 错误后 RxState 常卡 BUSY_RX,自愈里的 Receive_IT 静默失败
|
- 根治 485 接收停摆:HAL 处理 ORE 错误后 RxState 常卡 BUSY_RX,自愈里的 Receive_IT 静默失败
|
||||||
→ 错误回调重挂前强制 RxState=READY;查询前清缓冲时顺带检查接收中断是否停摆并拉起(不 Abort)
|
→ 错误回调重挂前强制 RxState=READY;查询前清缓冲时顺带检查接收中断是否停摆并拉起(不 Abort)
|
||||||
USART1/USART5 自愈同样加固
|
USART1/USART5 自愈同样加固
|
||||||
|
- 485 丢帧根因定位并加固:上位机秒回时回复帧头被 485 收发器切换延迟切掉(真秤有处理延迟不受影响);
|
||||||
|
现 400ms 无好帧或收到坏帧自动补发一次查询,仍不行才报无应答
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue