diff --git a/STM32F103_App1/HardWare/RELAY/ext_relay.c b/STM32F103_App1/HardWare/RELAY/ext_relay.c
index 8f3da2b..7b45306 100644
--- a/STM32F103_App1/HardWare/RELAY/ext_relay.c
+++ b/STM32F103_App1/HardWare/RELAY/ext_relay.c
@@ -37,9 +37,17 @@ static uint16_t ext_crc16(const uint8_t *data, uint16_t len)
return crc;
}
+/* 帧事件(on_frame 置位, process 消费; 同在 app_task 单线程) */
+static uint8_t rx_echo_ok = 0;
+static uint8_t rx_state_ok = 0;
+static uint8_t rx_exc = 0;
+
/* 总线发送: 等 50ms 静默 + 清接收缓冲(防陈旧帧) + 发送 + 刷新时间戳 */
static void ext_tx(const uint8_t *frame, uint16_t len)
{
+ rx_echo_ok = 0; /* 清上一事务残留的应答标志, 防止迟到帧被当前事务误消费 */
+ rx_state_ok = 0;
+ rx_exc = 0;
uint32_t dt = HAL_GetTick() - rs485_bus_last_tick();
if (dt < 50u) vTaskDelay(50u - dt);
USART2_FlushRxBuf();
@@ -82,6 +90,7 @@ static uint8_t s_fb = 0; /* REG1
static uint8_t s_fault = 0; /* REG2 故障标志 */
static uint16_t s_ver = 0; /* REG3 从机版本 */
static uint8_t s_miss = 0; /* 连续无应答计数 */
+static uint8_t s_fault_logged = 0; /* 已打印的故障位(变化才重打) */
static uint32_t s_last_poll = 0;
/* 命令状态机 */
@@ -93,10 +102,6 @@ static uint8_t cmd_is_restore = 0;/*
static uint32_t cmd_tick = 0;
static char cmd_id[20] = {0};
-/* 帧事件(on_frame 置位, process 消费; 同在 app_task 单线程) */
-static uint8_t rx_echo_ok = 0;
-static uint8_t rx_state_ok = 0;
-static uint8_t rx_exc = 0;
#define EXT_STATE_EEPROM_IDX 5 /* MqttInfoStr.Relay_State[5] 原保留字节: 扩展板状态位掩码 */
@@ -290,8 +295,11 @@ void ext_relay_process(void)
}
} else if (cmd_is_poll) {
cmd_is_poll = 0;
- if (s_fault) {
- log_warn("> EXT: 反馈异常标志=%02X (输出=%02X 反馈=%02X)", s_fault, s_state, s_fb);
+ if (s_fault != s_fault_logged) { /* 故障位变化才打印, 防止每 2s 刷屏 */
+ s_fault_logged = s_fault;
+ if (s_fault) {
+ log_warn("> EXT: 反馈异常标志=%02X (输出=%02X 反馈=%02X)", s_fault, s_state, s_fb);
+ }
}
} else {
/* 与板载继电器反馈同语义: 输出位和反馈位都要等于目标状态才算成功
diff --git a/STM32F103_App1/HardWare/RELAY/relay.c b/STM32F103_App1/HardWare/RELAY/relay.c
index 892266c..49fae19 100644
--- a/STM32F103_App1/HardWare/RELAY/relay.c
+++ b/STM32F103_App1/HardWare/RELAY/relay.c
@@ -135,7 +135,7 @@ GPIO_PinState relayReadFb(uint8_t ch)
/* 设置指定继电器开关状态: 只写 GPIO 和 Relay_State, 不碰 EEPROM/网络 */
void relaySet(uint8_t ch, uint8_t on)
{
- if (ch < 1 || ch > 8) return;
+ if (ch < 1 || ch > 4) return;
MqttInfoStr.Relay_State[ch] = on ? 1 : 0;
switch (ch) {
case 1: if (on) Relay1_ON; else Relay1_OFF; break;
@@ -191,7 +191,7 @@ void relayAction(uint8_t *data)
p = strstr((char *)data, "\"sw");
ch = p[3] - '0';
/* sw1 与 feeding 指令等效, 均控制继电器 1 */
- if (ch < 1 || ch > 4) { log_warn("> 继电器: sw 编号无效,仅支持 sw1~sw4"); return; }
+ if (ch < 1 || ch > 8) { log_warn("> 继电器: sw 编号无效,仅支持 sw1~sw8"); return; }
swkey[0] = 's'; swkey[1] = 'w'; swkey[2] = (char)('0' + ch); swkey[3] = '\0';
if (!proto_get_bool((char *)data, swkey, &on)) {
diff --git a/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx b/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx
index 7ae1993..21ae48c 100644
--- a/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx
+++ b/STM32F103_App1/MDK-ARM/STM32F103rb_App1.uvoptx
@@ -750,6 +750,19 @@
0
0
0
+ ..\HardWare\RELAY\ext_relay.c
+ ext_relay.c
+ 0
+ 0
+
+
+ 7
+ 37
+ 1
+ 0
+ 0
+ 0
+ 0
..\HardWare\LOG\log.c
log.c
0
@@ -757,7 +770,7 @@
7
- 37
+ 38
1
0
0
@@ -770,7 +783,7 @@
7
- 38
+ 39
1
0
0
@@ -783,7 +796,7 @@
7
- 39
+ 40
1
0
0
@@ -796,7 +809,7 @@
7
- 40
+ 41
1
0
0
@@ -809,7 +822,7 @@
7
- 41
+ 42
1
0
0
@@ -822,7 +835,7 @@
7
- 42
+ 43
1
0
0
@@ -835,7 +848,7 @@
7
- 43
+ 44
1
0
0
@@ -848,7 +861,7 @@
7
- 44
+ 45
1
0
0
@@ -861,7 +874,7 @@
7
- 45
+ 46
1
0
0
@@ -874,7 +887,7 @@
7
- 46
+ 47
1
0
0
@@ -887,7 +900,7 @@
7
- 47
+ 48
1
0
0
@@ -900,7 +913,7 @@
7
- 48
+ 49
1
0
0
@@ -913,7 +926,7 @@
7
- 49
+ 50
1
0
0
@@ -926,7 +939,7 @@
7
- 50
+ 51
1
0
0
@@ -939,7 +952,7 @@
7
- 51
+ 52
1
0
0
@@ -960,7 +973,7 @@
0
8
- 52
+ 53
5
0
0