V1.5: 撤掉485查询前的硬件复位(AbortReceive会把接收搞死),改只清软件缓冲,接收恢复常开

This commit is contained in:
helei 2026-08-22 11:47:38 +08:00
parent caf406d146
commit 880a83ca02
4 changed files with 9 additions and 17 deletions

View File

@ -148,9 +148,8 @@ 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(); /* 清缓冲+重挂接收,防止前次残留状态吞掉本次应答 */
USART2_FlushRxBuf(); /* 只清软件缓冲(残留回声/垃圾),硬件接收常开不动 */
HAL_UART_Transmit(&huart2, (uint8_t *)RS485_WEIGHT_CMD, sizeof(RS485_WEIGHT_CMD), 100);
/* 不再清回声:回声与应答的合并帧由解析处的帧头搜索处理 */
}
/* 读取 485 返回帧 */

View File

@ -262,23 +262,14 @@ void USART2_StartRx(void)
HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
}
/* 强制复位 USART2 接收:清错误标志/缓冲并重新挂中断接收。
* 485 ORE HAL
* RxState READY */
void USART2_ForceRxReset(void)
/* 清 USART2 软件接收缓冲(不动硬件)。
* 485 /
* AbortReceive/
* ISR + ORE */
void USART2_FlushRxBuf(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 表示暂无完整帧 */

View File

@ -36,7 +36,7 @@ void USART2_StartRx(void); /*
void UART5_StartRx(void); /* 启动 UART5 中断接收HLW8032 */
void USART2_Tick(void); /* 触发 USART2 帧超时自动提交 */
uint16_t USART2_GetFrame(uint8_t *out, uint16_t out_size);
void USART2_ForceRxReset(void); /* 强制复位 USART2 接收485 查询前调用 */ /* 从 USART2 取一帧原始字节 */
void USART2_FlushRxBuf(void); /* 清 USART2 软件接收缓冲485 查询前调用,不动硬件 */ /* 从 USART2 取一帧原始字节 */
int USART1_CheckCommand(const char *cmd); /* 检查是否收到指定命令(不区分大小写) */
const char *USART1_GetCommand(void); /* 获取当前接收到的命令字符串 */

View File

@ -188,3 +188,5 @@
改为回声帧按内容识别静默丢弃(与查询命令完全一致的帧),合并帧靠 01 03 04 帧头搜索解析
- 485 首次查询延迟 3s避开上电窗口防止首个应答被开机繁忙期撞坏
- 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN无应答有应答则原有 hex/解析日志覆盖
- 撤掉 485 查询前的 ForceRxResetAbortReceive 重挂会把接收搞死,只收到应答最后一个字节);
改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留