V1.5: 根治485接收停摆(ORE后RxState卡BUSY_RX致Receive_IT静默失败,强制归位再重挂;查询前检查兜底)
This commit is contained in:
parent
880a83ca02
commit
7339ce31d9
|
|
@ -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_RX,Receive_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_RX,Receive_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_RX,Receive_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 表示暂无完整帧 */
|
||||||
|
|
|
||||||
|
|
@ -190,3 +190,6 @@
|
||||||
- 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN(无应答),有应答则原有 hex/解析日志覆盖
|
- 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN(无应答),有应答则原有 hex/解析日志覆盖
|
||||||
- 撤掉 485 查询前的 ForceRxReset(AbortReceive 重挂会把接收搞死,只收到应答最后一个字节);
|
- 撤掉 485 查询前的 ForceRxReset(AbortReceive 重挂会把接收搞死,只收到应答最后一个字节);
|
||||||
改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留
|
改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留
|
||||||
|
- 根治 485 接收停摆:HAL 处理 ORE 错误后 RxState 常卡 BUSY_RX,自愈里的 Receive_IT 静默失败
|
||||||
|
→ 错误回调重挂前强制 RxState=READY;查询前清缓冲时顺带检查接收中断是否停摆并拉起(不 Abort)
|
||||||
|
USART1/USART5 自愈同样加固
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue