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 鑷剤鍚屾牱鍔犲浐