V1.5: 修正485回声处理(去掉TX后清缓冲,回声帧按内容识别静默丢弃,帧头搜索兜底)
This commit is contained in:
parent
a4d8420bff
commit
ab06e715ed
|
|
@ -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+字节数04):485 回声或前导垃圾可能混在帧头前面 */
|
/* 定位应答帧头(站号+03+字节数04):485 回声或前导垃圾可能混在帧头前面 */
|
||||||
|
|
@ -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; /* 保存原始毛重 */
|
||||||
|
|
|
||||||
|
|
@ -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 帧头搜索解析
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue