From d2104fd90f5b39c3c1946b4077656998dbc461dd Mon Sep 17 00:00:00 2001 From: helei Date: Sat, 22 Aug 2026 12:36:25 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20485=E6=9F=A5=E8=AF=A2=E5=89=8D=E6=89=93?= =?UTF-8?q?=E5=8D=B0USART2=E7=A1=AC=E4=BB=B6=E7=8A=B6=E6=80=81(CR1/SR/RxSt?= =?UTF-8?q?ate/=E5=AD=97=E8=8A=82=E8=AE=A1=E6=95=B0/=E7=BC=93=E5=86=B2?= =?UTF-8?q?=E7=B4=A2=E5=BC=95),=E5=AE=9A=E4=BD=8D=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E6=AD=BB=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c | 6 ++++++ V1.5/STM32F103_App1/HardWare/UART/uart.c | 4 ++++ V1.5/STM32F103_App1/HardWare/UART/uart.h | 4 +++- 3 files changed, 13 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 c8d04b6..24b94d4 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -148,6 +148,12 @@ 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) { + /* 排障:打印接收通道硬件状态(CR1 含 RXNEIE 位、SR 含 ORE/FE/RXNE 标志、 + * HAL 状态、本次查询前累计收到的字节数、缓冲索引) */ + log_info("> FEED: UART2 CR1=%04X SR=%04X st=%u cnt=%lu idx=%u", + (unsigned)USART2->CR1, (unsigned)USART2->SR, + (unsigned)huart2.RxState, + (unsigned long)g_uart2_rx_byte_cnt, (unsigned)USART2_GetRxIndex()); USART2_FlushRxBuf(); /* 只清软件缓冲(残留回声/垃圾),硬件接收常开不动 */ 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 66fffb6..735e50e 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.c +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.c @@ -29,6 +29,7 @@ static uint8_t uart1_cmd_index = 0; static uint32_t uart1_last_rx_tick = 0; static uint8_t uart2_rx_byte = 0; +volatile uint32_t g_uart2_rx_byte_cnt = 0; /* USART2 累计收到的字节数(485 排障用) */ static uint8_t uart5_rx_byte = 0; static uint8_t uart2_cmd_buf[UART2_RX_BUF_SIZE] = {0}; static uint8_t uart2_cmd_index = 0; @@ -269,6 +270,8 @@ void USART2_StartRx(void) * 485 查询前调用,丢弃缓冲里残留的回声/垃圾,让应答帧从干净状态开始。 * 注意:不要在这里 AbortReceive/重挂中断——实测会把接收搞死, * 硬件接收从开机起常开(ISR 逐字节重挂 + ORE 自愈),不需要动 */ +uint16_t USART2_GetRxIndex(void) { return uart2_cmd_index; } /* 排障用 */ + void USART2_FlushRxBuf(void) { uart2_rx_ready = 0; @@ -317,6 +320,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) } else if (huart->Instance == USART2) { uint8_t ch = uart2_rx_byte; + g_uart2_rx_byte_cnt++; if (uart2_cmd_index < UART2_RX_BUF_SIZE - 1) { uart2_cmd_buf[uart2_cmd_index++] = ch; uart2_last_rx_tick = HAL_GetTick(); diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.h b/V1.5/STM32F103_App1/HardWare/UART/uart.h index bae14ba..996a8dc 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.h +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.h @@ -36,7 +36,9 @@ void USART2_StartRx(void); /* void UART5_StartRx(void); /* 启动 UART5 中断接收(HLW8032) */ void USART2_Tick(void); /* 触发 USART2 帧超时自动提交 */ uint16_t USART2_GetFrame(uint8_t *out, uint16_t out_size); -void USART2_FlushRxBuf(void); /* 清 USART2 软件接收缓冲(485 查询前调用,不动硬件) */ /* 从 USART2 取一帧原始字节 */ +void USART2_FlushRxBuf(void); +extern volatile uint32_t g_uart2_rx_byte_cnt; +uint16_t USART2_GetRxIndex(void); /* USART2 收字节计数(485 排障) */ /* 清 USART2 软件接收缓冲(485 查询前调用,不动硬件) */ /* 从 USART2 取一帧原始字节 */ int USART1_CheckCommand(const char *cmd); /* 检查是否收到指定命令(不区分大小写) */ const char *USART1_GetCommand(void); /* 获取当前接收到的命令字符串 */