From c5b0922004a28aa018ddb44572a23246aea33817 Mon Sep 17 00:00:00 2001 From: helei Date: Sat, 22 Aug 2026 13:06:50 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20485=E5=8F=96=E5=B8=A7=E6=94=B9=E5=8E=9F?= =?UTF-8?q?=E5=AD=90=E6=93=8D=E4=BD=9CUSART2=5FPollFrame,=E6=B6=88?= =?UTF-8?q?=E9=99=A4Tick/GetFrame=E4=BA=A4=E6=8E=A5=E4=B8=A2=E5=B8=A7?= =?UTF-8?q?=E7=AA=97=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HardWare/FEED_SCALE/feed_scale.c | 7 ++---- V1.5/STM32F103_App1/HardWare/UART/uart.c | 22 +++++++++++++++++++ V1.5/STM32F103_App1/HardWare/UART/uart.h | 1 + V1.5/鐗堟湰璇存槑.md | 2 ++ 4 files changed, 27 insertions(+), 5 deletions(-) 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 bff10e0..ed6a05c 100644 --- a/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c +++ b/V1.5/STM32F103_App1/HardWare/FEED_SCALE/feed_scale.c @@ -163,9 +163,7 @@ static void feed_scale_send_query(void) /* 读取 485 返回帧 */ static int feed_scale_read_frame(uint8_t *buf, uint16_t max_len) { - uint16_t len = USART2_GetFrame(buf, max_len); - if (len == 0) return 0; - return (int)len; + return (int)USART2_PollFrame(buf, max_len); /* 原子取帧,无交接状态 */ } /* 上报当前状态到平台: 开关、重量、单次投料量、去皮重量。返回 0=已发出 */ @@ -379,8 +377,7 @@ void feedScaleProcess(void) uint16_t cur_weight; int32_t diff; - /* 触发 USART2 帧超时自动提交 */ - USART2_Tick(); + /* 原子取帧在 feed_scale_read_frame 内完成,无需再 Tick */ /* 空闲时 10s 查询一次; 投喂时 1s 查询一次; 不累计无响应计数,手动测试时漏回也不会一直刷超时 */ diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.c b/V1.5/STM32F103_App1/HardWare/UART/uart.c index 9f5f818..c3ab19e 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.c +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.c @@ -368,6 +368,28 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) } } +/* 原子取帧:20ms 静默判帧完整 → 直接拷出并清缓冲,一步完成。 + * 替代旧的 Tick(置标志)+GetFrame(取帧) 两步交接——两步之间被查询/补发的 + * 清缓冲打断时会丢帧(485 丢帧根因) */ +uint16_t USART2_PollFrame(uint8_t *out, uint16_t out_size) +{ + if (uart2_cmd_index > 0 && + (HAL_GetTick() - uart2_last_rx_tick) > UART2_CMD_TIMEOUT_MS) { + /* 排障:帧提交时打印内容(485 丢帧定位) */ + char hex[3 * 24 + 1] = {0}; + uint16_t n0 = uart2_cmd_index < 24 ? uart2_cmd_index : 24; + for (uint16_t i = 0; i < n0; i++) snprintf(hex + i * 3, 4, "%02X ", uart2_cmd_buf[i]); + log_info("> UART2: 帧提交 %d 字节: %s", (int)uart2_cmd_index, hex); + uint16_t len = uart2_cmd_index < out_size ? uart2_cmd_index : out_size - 1; + memcpy(out, uart2_cmd_buf, len); + out[len] = 0; + uart2_cmd_index = 0; + uart2_rx_ready = 0; + return len; + } + return 0; +} + /* 在 USART2_GetFrame 被轮询前,20ms 无新字节自动提交帧 */ void USART2_Tick(void) { diff --git a/V1.5/STM32F103_App1/HardWare/UART/uart.h b/V1.5/STM32F103_App1/HardWare/UART/uart.h index 996a8dc..b0e76b7 100644 --- a/V1.5/STM32F103_App1/HardWare/UART/uart.h +++ b/V1.5/STM32F103_App1/HardWare/UART/uart.h @@ -36,6 +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); +uint16_t USART2_PollFrame(uint8_t *out, uint16_t out_size); /* 原子取帧(判静默+拷出一步完成) */ void USART2_FlushRxBuf(void); extern volatile uint32_t g_uart2_rx_byte_cnt; uint16_t USART2_GetRxIndex(void); /* USART2 收字节计数(485 排障) */ /* 清 USART2 软件接收缓冲(485 查询前调用,不动硬件) */ /* 从 USART2 取一帧原始字节 */ diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index fcf25a2..b77934d 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -195,3 +195,5 @@ USART1/USART5 鑷剤鍚屾牱鍔犲浐 - 485 涓㈠抚鏍瑰洜瀹氫綅骞跺姞鍥猴細涓婁綅鏈虹鍥炴椂鍥炲甯уご琚 485 鏀跺彂鍣ㄥ垏鎹㈠欢杩熷垏鎺夛紙鐪熺Г鏈夊鐞嗗欢杩熶笉鍙楀奖鍝嶏級锛 鐜 400ms 鏃犲ソ甯ф垨鏀跺埌鍧忓抚鑷姩琛ュ彂涓娆℃煡璇紝浠嶄笉琛屾墠鎶ユ棤搴旂瓟 +- 485 鍙栧抚鏀瑰師瀛愭搷浣滐細USART2_PollFrame 鍒ら潤榛+鎷峰嚭+娓呯紦鍐蹭竴姝ュ畬鎴愶紝鏇夸唬 Tick 缃爣蹇/GetFrame 鍙栧抚 + 鐨勪袱姝ヤ氦鎺ワ紙浜ゆ帴绐楀彛浼氳鏌ヨ琛ュ彂鐨勬竻缂撳啿鎵撴柇涓㈠抚锛