From cd42b75f53edc21459bba82088db8306bb6caeb2 Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 24 Jul 2026 09:06:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(rs485):=20=E4=BF=AE=E5=A4=8D=E6=AD=BB?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E5=AF=BC=E8=87=B4=E5=9C=B0=E6=84=9F=E4=B8=8D?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: 1. rs485_send() 中 while(R8_UART0_TFC == 0) 逻辑反了 TFC=0 表示 FIFO 空, ==0 时条件永真 → 死循环卡死主循环 修复: ==0 → !=0 (等 FIFO 空再写下一字节) 2. rs485_init() 从未被调用 gpio_uart_init() 仅写了注释, 未实际调用 → UART0/GPIO 未初始化 修复: 替换注释为实际函数调用 3. 首次心跳立即触发 _hb_last_ms 静态初始化为 0 → 首次 poll 立即发心跳 修复: rs485_init() 末尾 _hb_last_ms = mstick() --- BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c | 2 +- BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c b/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c index a5933fd..56f6339 100644 --- a/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c +++ b/BLE/DLD154Pro_Peripheral_28K/APP/peripheral_main.c @@ -392,7 +392,7 @@ void tm_init(void){ void gpio_uart_init(void) { /*--- RS485 通信 (PA14=TX, PA15=RX, PA13=RE) ---*/ - /* 由 rs485_init() 统一初始化 UART0 + GPIO + 中断 */ + rs485_init(); /* 初始化 UART0 + GPIO + 中断 */ /*--- 光耦输入 (PB10=IN_1) ---*/ /* 逻辑待定, 仅初始化引脚为输入上拉 */ diff --git a/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c b/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c index e5d55d0..4368dd6 100644 --- a/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c +++ b/BLE/DLD154Pro_Peripheral_28K/APP/rs485_700bs.c @@ -60,6 +60,7 @@ void rs485_init(void) PFIC_EnableIRQ(UART0_IRQn); RS485_RE_RX(); // 默认接收模式 + _hb_last_ms = mstick(); // 对齐心跳起始时刻,避免首次立即触发 PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD); } @@ -72,10 +73,10 @@ static void rs485_send(const uint8_t *data, uint8_t len) mDelayuS(100); // 总线稳定 for (uint8_t i = 0; i < len; i++) { - while (R8_UART0_TFC == 0); // 等 TX FIFO 空 + while (R8_UART0_TFC != 0); // 等 TX FIFO 空 (上一字节发完) R8_UART0_THR = data[i]; } - while (R8_UART0_TFC == 0); // 等最后一字节发完 + while (R8_UART0_TFC != 0); // 等最后一字节发完 mDelayuS(500); // 等待停止位 + 总线释放 UART0_CLR_TXFIFO(); RS485_RE_RX();