From bf828d6a22adc96c4032653cde4c3bfef6c5b197 Mon Sep 17 00:00:00 2001 From: helei Date: Sat, 22 Aug 2026 10:48:04 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20=E4=BF=AE=E5=A4=8D485=E9=A6=96=E6=AC=A1?= =?UTF-8?q?=E5=BA=94=E7=AD=94=E4=B8=A2=E5=A4=B1(=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=89=8D=E5=BC=BA=E5=88=B6=E5=A4=8D=E4=BD=8DUSART2=E6=8E=A5?= =?UTF-8?q?=E6=94=B6,=E9=98=B2ORE=E6=AE=8B=E7=95=99=E5=8D=A1=E6=AD=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HardWare/FEED_SCALE/feed_scale.c | 1 + V1.5/STM32F103_App1/HardWare/UART/uart.c | 19 +++++++++++++++++++ V1.5/STM32F103_App1/HardWare/UART/uart.h | 3 ++- V1.5/版本说明.md | 2 ++ 4 files changed, 24 insertions(+), 1 deletion(-) 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 1d5dc20..3dc6f4c 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -124,6 +124,7 @@ static int feed_scale_parse_weight(const uint8_t *buf, uint16_t len, uint16_t *w /* ͨ USART2 485 ѯ */ static void feed_scale_send_query(void) { + USART2_ForceRxReset(); /* 建+عҽգֹǰβ״̵̬Ӧ */ HAL_UART_Transmit(&huart2, (uint8_t *)RS485_WEIGHT_CMD, sizeof(RS485_WEIGHT_CMD), 100); } diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.c b/V1.5/STM32F103_App1/HardWare/UART/uart.c index 714ca31..2bcf779 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.c +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.c @@ -262,6 +262,25 @@ void USART2_StartRx(void) HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); } +/* ǿƸλ USART2 գ־/岢¹жϽա + * 485 ѯǰáORE ȴ HAL ״̬عҲ + * RxState READY ĬʧܣλĻ֮Ӧղ */ +void USART2_ForceRxReset(void) +{ + __HAL_UART_CLEAR_OREFLAG(&huart2); + __HAL_UART_CLEAR_PEFLAG(&huart2); + __HAL_UART_CLEAR_FEFLAG(&huart2); + __HAL_UART_CLEAR_NEFLAG(&huart2); + __HAL_UART_CLEAR_IDLEFLAG(&huart2); + huart2.ErrorCode = HAL_UART_ERROR_NONE; + if (huart2.RxState != HAL_UART_STATE_READY) { + HAL_UART_AbortReceive(&huart2); + } + uart2_rx_ready = 0; + uart2_cmd_index = 0; + HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); +} + /* USART2 ջȡһ֡20ms ֽڽ֡ȣ0 ʾ֡ */ uint16_t USART2_GetFrame(uint8_t *out, uint16_t out_size) { diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.h b/V1.5/STM32F103_App1/HardWare/UART/uart.h index 1ac9753..faf2bcc 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.h +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.h @@ -35,7 +35,8 @@ void USART1_StartRx(void); /* void USART2_StartRx(void); /* USART2 жϽ */ void UART5_StartRx(void); /* UART5 жϽգHLW8032 */ void USART2_Tick(void); /* USART2 ֡ʱԶύ */ -uint16_t USART2_GetFrame(uint8_t *out, uint16_t out_size); /* USART2 ȡһ֡ԭʼֽ */ +uint16_t USART2_GetFrame(uint8_t *out, uint16_t out_size); +void USART2_ForceRxReset(void); /* ǿƸλ USART2 գ485 ѯǰã */ /* USART2 ȡһ֡ԭʼֽ */ int USART1_CheckCommand(const char *cmd); /* ǷյָִСд */ const char *USART1_GetCommand(void); /* ȡǰյַ */ diff --git a/V1.5/版本说明.md b/V1.5/版本说明.md index 546326f..b22a06e 100644 --- a/V1.5/版本说明.md +++ b/V1.5/版本说明.md @@ -180,3 +180,5 @@ (无应答/帧短/CRC错/秤异常帧/站号不符);无秤模式仍显示开关状态 - 断电预警时 OLED 关显示(0xAE 黑屏,省电+避免残影) - 去掉 OLED 防烧屏左右偏移(断电已关屏,偏移意义不大) +- 修复 485 首次应答丢失:USART2 接收可能因 ORE 残留状态卡死(自愈重挂因 RxState 非 READY 静默失败), + 现每次查询前 USART2_ForceRxReset() 强制复位接收(清错误/缓冲+重挂中断),首包不再丢