From 7339ce31d962a66be62772beb67fe479fafdacda Mon Sep 17 00:00:00 2001 From: helei Date: Sat, 22 Aug 2026 11:55:05 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20=E6=A0=B9=E6=B2=BB485=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E5=81=9C=E6=91=86(ORE=E5=90=8ERxState=E5=8D=A1BUSY=5FRX?= =?UTF-8?q?=E8=87=B4Receive=5FIT=E9=9D=99=E9=BB=98=E5=A4=B1=E8=B4=A5,?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E5=BD=92=E4=BD=8D=E5=86=8D=E9=87=8D=E6=8C=82?= =?UTF-8?q?;=E6=9F=A5=E8=AF=A2=E5=89=8D=E6=A3=80=E6=9F=A5=E5=85=9C?= =?UTF-8?q?=E5=BA=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- V1.5/STM32F103_App1/HardWare/UART/uart.c | 10 ++++++++++ V1.5/鐗堟湰璇存槑.md | 3 +++ 2 files changed, 13 insertions(+) diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.c b/V1.5/STM32F103_App1/HardWare/UART/uart.c index 240b46d..66fffb6 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.c +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.c @@ -190,6 +190,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) __HAL_UART_CLEAR_NEFLAG(huart); __HAL_UART_CLEAR_IDLEFLAG(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; + huart1.RxState = HAL_UART_STATE_READY; /* 关键:HAL 错误处理后 RxState 常卡 BUSY_RX,Receive_IT 会静默失败,接收永久停摆 */ HAL_UART_Receive_IT(&huart1, &uart1_rx_byte, 1); /* 蓝牙/调试口被 ORE 弄挂后立即恢复接收 */ } else if (huart->Instance == USART2) { @@ -199,6 +200,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) __HAL_UART_CLEAR_NEFLAG(huart); __HAL_UART_CLEAR_IDLEFLAG(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; + huart2.RxState = HAL_UART_STATE_READY; /* 关键:HAL 错误处理后 RxState 常卡 BUSY_RX,Receive_IT 会静默失败,接收永久停摆 */ HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); /* RS485 秤口同样自愈 */ } else if (huart->Instance == UART5) { @@ -208,6 +210,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) __HAL_UART_CLEAR_NEFLAG(huart); __HAL_UART_CLEAR_IDLEFLAG(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; + huart5.RxState = HAL_UART_STATE_READY; /* 关键:HAL 错误处理后 RxState 常卡 BUSY_RX,Receive_IT 会静默失败,接收永久停摆 */ HAL_UART_Receive_IT(&huart5, &uart5_rx_byte, 1); /* HLW8032 口同样自愈 */ } else if (huart->Instance == USART3) { @@ -270,6 +273,13 @@ void USART2_FlushRxBuf(void) { uart2_rx_ready = 0; uart2_cmd_index = 0; + /* 兜底:接收中断意外停摆时(ORE 后状态卡 BUSY_RX)拉起来。不 Abort,不动正常状态 */ + if (!(USART2->CR1 & USART_CR1_RXNEIE)) { + __HAL_UART_CLEAR_OREFLAG(&huart2); + huart2.ErrorCode = HAL_UART_ERROR_NONE; + huart2.RxState = HAL_UART_STATE_READY; + HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); + } } /* 从 USART2 接收缓冲区取出一帧(20ms 无新字节结束),返回帧长度,0 表示暂无完整帧 */ diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index 5d18030..419ca18 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -190,3 +190,6 @@ - 485 鏌ヨ鏃ュ織澧炲己锛氭煡璇㈠彂鍑 1s 鏃犱换浣曞簲绛斿抚鎵 WARN锛堟棤搴旂瓟锛夛紝鏈夊簲绛斿垯鍘熸湁 hex/瑙f瀽鏃ュ織瑕嗙洊 - 鎾ゆ帀 485 鏌ヨ鍓嶇殑 ForceRxReset锛圓bortReceive 閲嶆寕浼氭妸鎺ユ敹鎼炴锛屽彧鏀跺埌搴旂瓟鏈鍚庝竴涓瓧鑺傦級锛 鏀逛负鍙竻杞欢缂撳啿涓嶅姩纭欢锛屾帴鏀跺洖鍒版渶鍒濆父寮鏂瑰紡锛涘抚澶存悳绱/鍥炲0璇嗗埆/鏃犲簲绛旀棩蹇椾繚鐣 +- 鏍规不 485 鎺ユ敹鍋滄憜锛欻AL 澶勭悊 ORE 閿欒鍚 RxState 甯稿崱 BUSY_RX锛岃嚜鎰堥噷鐨 Receive_IT 闈欓粯澶辫触 + 鈫 閿欒鍥炶皟閲嶆寕鍓嶅己鍒 RxState=READY锛涙煡璇㈠墠娓呯紦鍐叉椂椤哄甫妫鏌ユ帴鏀朵腑鏂槸鍚﹀仠鎽嗗苟鎷夎捣锛堜笉 Abort锛 + USART1/USART5 鑷剤鍚屾牱鍔犲浐