V1.5: 修正485回声处理(去掉TX后清缓冲,回声帧按内容识别静默丢弃,帧头搜索兜底)

This commit is contained in:
helei 2026-08-22 11:16:22 +08:00
parent a4d8420bff
commit ab06e715ed
2 changed files with 12 additions and 3 deletions

View File

@ -78,6 +78,12 @@ static void feed_scale_dump_frame(const uint8_t *buf, uint16_t len)
/* 从 485 应答中解析重量,应答 9 字节: 01 03 04 41 97 30 33 0B F6 */ /* 从 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) static int feed_scale_parse_weight(const uint8_t *buf, uint16_t len, uint16_t *weight_100g)
{ {
/* 485 回声(自己发出去的查询被 RX 听到):静默丢弃,不打日志不报错 */
if (len == sizeof(RS485_WEIGHT_CMD) &&
memcmp(buf, RS485_WEIGHT_CMD, sizeof(RS485_WEIGHT_CMD)) == 0) {
return -7;
}
feed_scale_dump_frame(buf, len); feed_scale_dump_frame(buf, len);
/* 定位应答帧头(站号+03+字节数04485 回声或前导垃圾可能混在帧头前面 */ /* 定位应答帧头(站号+03+字节数04485 回声或前导垃圾可能混在帧头前面 */
@ -143,8 +149,7 @@ static void feed_scale_send_query(void)
{ {
USART2_ForceRxReset(); /* 清缓冲+重挂接收,防止前次残留状态吞掉本次应答 */ USART2_ForceRxReset(); /* 清缓冲+重挂接收,防止前次残留状态吞掉本次应答 */
HAL_UART_Transmit(&huart2, (uint8_t *)RS485_WEIGHT_CMD, sizeof(RS485_WEIGHT_CMD), 100); HAL_UART_Transmit(&huart2, (uint8_t *)RS485_WEIGHT_CMD, sizeof(RS485_WEIGHT_CMD), 100);
HAL_Delay(5); /* 等 485 回声(自己 TX 被 RX 听到)收尾 */ /* 不再清回声:回声与应答的合并帧由解析处的帧头搜索处理 */
USART2_ForceRxReset(); /* 清掉回声,应答帧从干净状态开始 */
} }
/* 读取 485 返回帧 */ /* 读取 485 返回帧 */
@ -386,7 +391,9 @@ void feedScaleProcess(void)
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) {
int prc = feed_scale_parse_weight(rx_buf, len, &cur_weight); int prc = feed_scale_parse_weight(rx_buf, len, &cur_weight);
s_last_err = (prc == 0) ? 0 : (prc == -1 ? 2 : (prc == -2 ? 3 : (prc == -4 ? 4 : 5))); if (prc != -7) { /* -7=回声帧:不影响状态显示 */
s_last_err = (prc == 0) ? 0 : (prc == -1 ? 2 : (prc == -2 ? 3 : (prc == -4 ? 4 : (prc == -6 ? 6 : 5))));
}
if (prc == 0) s_last_ok_tick = HAL_GetTick(); if (prc == 0) s_last_ok_tick = HAL_GetTick();
if (prc == 0) { if (prc == 0) {
last_raw_weight = cur_weight; /* 保存原始毛重 */ last_raw_weight = cur_weight; /* 保存原始毛重 */

View File

@ -184,3 +184,5 @@
现每次查询前 USART2_ForceRxReset() 强制复位接收(清错误/缓冲+重挂中断),首包不再丢 现每次查询前 USART2_ForceRxReset() 强制复位接收(清错误/缓冲+重挂中断),首包不再丢
- 修复 485 回声吃应答帧头:查询 TX 后等 5ms 清回声缓冲;解析时改为在帧内定位 01 03 04 帧头, - 修复 485 回声吃应答帧头:查询 TX 后等 5ms 清回声缓冲;解析时改为在帧内定位 01 03 04 帧头,
抗回声/前导垃圾(快速应答不再被吞前几个字节) 抗回声/前导垃圾(快速应答不再被吞前几个字节)
- 修正 485 修复方案:去掉 TX 后清缓冲(会吃掉快速回复的前几个字节),
改为回声帧按内容识别静默丢弃(与查询命令完全一致的帧),合并帧靠 01 03 04 帧头搜索解析