diff --git a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c index 419dec6..c8d04b6 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -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 返回帧 */ diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.c b/V1.5/STM32F103_App1/HardWare/UART/uart.c index 2bcf779..240b46d 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.c +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.c @@ -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 表示暂无完整帧 */ diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.h b/V1.5/STM32F103_App1/HardWare/UART/uart.h index faf2bcc..bae14ba 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.h +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.h @@ -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); /* 获取当前接收到的命令字符串 */ diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index f13ecf5..5d18030 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -188,3 +188,5 @@ 鏀逛负鍥炲0甯ф寜鍐呭璇嗗埆闈欓粯涓㈠純锛堜笌鏌ヨ鍛戒护瀹屽叏涓鑷寸殑甯э級锛屽悎骞跺抚闈 01 03 04 甯уご鎼滅储瑙f瀽 - 485 棣栨鏌ヨ寤惰繜 3s锛堥伩寮涓婄數绐楀彛锛岄槻姝㈤涓簲绛旇寮鏈虹箒蹇欐湡鎾炲潖锛 - 485 鏌ヨ鏃ュ織澧炲己锛氭煡璇㈠彂鍑 1s 鏃犱换浣曞簲绛斿抚鎵 WARN锛堟棤搴旂瓟锛夛紝鏈夊簲绛斿垯鍘熸湁 hex/瑙f瀽鏃ュ織瑕嗙洊 +- 鎾ゆ帀 485 鏌ヨ鍓嶇殑 ForceRxReset锛圓bortReceive 閲嶆寕浼氭妸鎺ユ敹鎼炴锛屽彧鏀跺埌搴旂瓟鏈鍚庝竴涓瓧鑺傦級锛 + 鏀逛负鍙竻杞欢缂撳啿涓嶅姩纭欢锛屾帴鏀跺洖鍒版渶鍒濆父寮鏂瑰紡锛涘抚澶存悳绱/鍥炲0璇嗗埆/鏃犲簲绛旀棩蹇椾繚鐣