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 棣栨搴旂瓟涓㈠け锛歎SART2 鎺ユ敹鍙兘鍥 ORE 娈嬬暀鐘舵佸崱姝伙紙鑷剤閲嶆寕鍥 RxState 闈 READY 闈欓粯澶辫触锛夛紝 + 鐜版瘡娆℃煡璇㈠墠 USART2_ForceRxReset() 寮哄埗澶嶄綅鎺ユ敹锛堟竻閿欒/缂撳啿+閲嶆寕涓柇锛夛紝棣栧寘涓嶅啀涓