V1.5: 根治485接收停摆(ORE后RxState卡BUSY_RX致Receive_IT静默失败,强制归位再重挂;查询前检查兜底)

This commit is contained in:
helei 2026-08-22 11:55:05 +08:00
parent 880a83ca02
commit 7339ce31d9
2 changed files with 13 additions and 0 deletions

View File

@ -190,6 +190,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
__HAL_UART_CLEAR_NEFLAG(huart); __HAL_UART_CLEAR_NEFLAG(huart);
__HAL_UART_CLEAR_IDLEFLAG(huart); __HAL_UART_CLEAR_IDLEFLAG(huart);
huart->ErrorCode = HAL_UART_ERROR_NONE; huart->ErrorCode = HAL_UART_ERROR_NONE;
huart1.RxState = HAL_UART_STATE_READY; /* 关键HAL 错误处理后 RxState 常卡 BUSY_RXReceive_IT 会静默失败,接收永久停摆 */
HAL_UART_Receive_IT(&huart1, &uart1_rx_byte, 1); /* 蓝牙/调试口被 ORE 弄挂后立即恢复接收 */ HAL_UART_Receive_IT(&huart1, &uart1_rx_byte, 1); /* 蓝牙/调试口被 ORE 弄挂后立即恢复接收 */
} }
else if (huart->Instance == USART2) { else if (huart->Instance == USART2) {
@ -199,6 +200,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
__HAL_UART_CLEAR_NEFLAG(huart); __HAL_UART_CLEAR_NEFLAG(huart);
__HAL_UART_CLEAR_IDLEFLAG(huart); __HAL_UART_CLEAR_IDLEFLAG(huart);
huart->ErrorCode = HAL_UART_ERROR_NONE; huart->ErrorCode = HAL_UART_ERROR_NONE;
huart2.RxState = HAL_UART_STATE_READY; /* 关键HAL 错误处理后 RxState 常卡 BUSY_RXReceive_IT 会静默失败,接收永久停摆 */
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); /* RS485 秤口同样自愈 */ HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1); /* RS485 秤口同样自愈 */
} }
else if (huart->Instance == UART5) { else if (huart->Instance == UART5) {
@ -208,6 +210,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
__HAL_UART_CLEAR_NEFLAG(huart); __HAL_UART_CLEAR_NEFLAG(huart);
__HAL_UART_CLEAR_IDLEFLAG(huart); __HAL_UART_CLEAR_IDLEFLAG(huart);
huart->ErrorCode = HAL_UART_ERROR_NONE; huart->ErrorCode = HAL_UART_ERROR_NONE;
huart5.RxState = HAL_UART_STATE_READY; /* 关键HAL 错误处理后 RxState 常卡 BUSY_RXReceive_IT 会静默失败,接收永久停摆 */
HAL_UART_Receive_IT(&huart5, &uart5_rx_byte, 1); /* HLW8032 口同样自愈 */ HAL_UART_Receive_IT(&huart5, &uart5_rx_byte, 1); /* HLW8032 口同样自愈 */
} }
else if (huart->Instance == USART3) { else if (huart->Instance == USART3) {
@ -270,6 +273,13 @@ void USART2_FlushRxBuf(void)
{ {
uart2_rx_ready = 0; uart2_rx_ready = 0;
uart2_cmd_index = 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 表示暂无完整帧 */ /* 从 USART2 接收缓冲区取出一帧20ms 无新字节结束返回帧长度0 表示暂无完整帧 */

View File

@ -190,3 +190,6 @@
- 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN无应答有应答则原有 hex/解析日志覆盖 - 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN无应答有应答则原有 hex/解析日志覆盖
- 撤掉 485 查询前的 ForceRxResetAbortReceive 重挂会把接收搞死,只收到应答最后一个字节); - 撤掉 485 查询前的 ForceRxResetAbortReceive 重挂会把接收搞死,只收到应答最后一个字节);
改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留 改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留
- 根治 485 接收停摆HAL 处理 ORE 错误后 RxState 常卡 BUSY_RX自愈里的 Receive_IT 静默失败
→ 错误回调重挂前强制 RxState=READY查询前清缓冲时顺带检查接收中断是否停摆并拉起不 Abort
USART1/USART5 自愈同样加固