V1.5: 撤掉485查询前的硬件复位(AbortReceive会把接收搞死),改只清软件缓冲,接收恢复常开
This commit is contained in:
parent
caf406d146
commit
880a83ca02
|
|
@ -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 返回帧 */
|
||||
|
|
|
|||
|
|
@ -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 表示暂无完整帧 */
|
||||
|
|
|
|||
|
|
@ -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); /* 获取当前接收到的命令字符串 */
|
||||
|
||||
|
|
|
|||
|
|
@ -188,3 +188,5 @@
|
|||
改为回声帧按内容识别静默丢弃(与查询命令完全一致的帧),合并帧靠 01 03 04 帧头搜索解析
|
||||
- 485 首次查询延迟 3s(避开上电窗口,防止首个应答被开机繁忙期撞坏)
|
||||
- 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN(无应答),有应答则原有 hex/解析日志覆盖
|
||||
- 撤掉 485 查询前的 ForceRxReset(AbortReceive 重挂会把接收搞死,只收到应答最后一个字节);
|
||||
改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留
|
||||
|
|
|
|||
Loading…
Reference in New Issue