初步测试OK

This commit is contained in:
edisondeng
2026-05-10 08:57:34 +08:00
parent ee67076ec7
commit 485fb32a72
7 changed files with 4343 additions and 4263 deletions

View File

@ -18,6 +18,14 @@ static modbus_client_state_t g_state = MODBUS_STATE_IDLE;
static uint32_t g_last_tick = 0;
static uint16_t g_transaction_id = 0;
/* 保存最新的寄存器值,用于心跳上报和变化检测 */
static uint16_t s_last_reg_val = 0xFFFF;
uint16_t ModbusTCP_Get_LastRegVal(void)
{
return s_last_reg_val;
}
/* 服务器信息 */
static uint8_t dest_ip[4] = MODBUS_SERVER_IP;
static uint16_t dest_port = MODBUS_SERVER_PORT;
@ -134,12 +142,32 @@ void ModbusTCP_Client_Task(void)
break;
case MODBUS_STATE_WAIT_RESPONSE: // 等待响应状态
if ((len = getSn_RX_RSR(g_sn)) > 0) { // 检查是否有数据到达
len = getSn_RX_RSR(g_sn);
if (len >= 9) { // 至少需要 9 字节 (MBAP 头 7 字节 + PDU 至少 2 字节)
if (len > sizeof(tmp_buf)) len = sizeof(tmp_buf); // 防止缓存溢出
ret = recv(g_sn, tmp_buf, len); // 接收数据
if (ret > 0) { // 接收成功
g_state = MODBUS_STATE_PROCESS_DATA; // 切换到处理数据状态
/* 校验响应 (检查 MBAP 长度、功能码等) */
if (ret >= 9 && tmp_buf[7] == 0x03) { // 基本校验
uint16_t reg_val = (tmp_buf[9] << 8) | tmp_buf[10]; // 提取寄存器值
LOG_INFO("MODBUS", "Read Register %d OK: 0x%04X", TARGET_REG_ADDR + 40001, reg_val);
/* 如果检测到寄存器值发生变化,才通过 433 无线立即发送 */
if (reg_val != s_last_reg_val) {
s_last_reg_val = reg_val; // 更新缓存的值
uint8_t payload[2]; // 构造 433 负载
payload[0] = tmp_buf[9]; // 寄存器高位
payload[1] = tmp_buf[10]; // 寄存器低位
RF433_SendPacket(PROTO_TYPE_NET, payload, 2); // 打包并通过无线发出
LOG_INFO("MODBUS", "Value changed, sent over 433");
}
} else { // 响应格式非法
LOG_ERROR("MODBUS", "Invalid response format");
}
g_state = MODBUS_STATE_IDLE; // 返回空闲
g_last_tick = HAL_GetTick(); // 更新计时
} else if (HAL_GetTick() - g_last_tick > 3000) { // 等待超时 (3秒)
LOG_WARN("MODBUS", "Response timeout");
close(g_sn); // 关闭连接
@ -147,27 +175,6 @@ void ModbusTCP_Client_Task(void)
}
break;
case MODBUS_STATE_PROCESS_DATA: // 处理数据状态
/* 校验响应 (检查 MBAP 长度、功能码等) */
if (len >= 9 && tmp_buf[7] == 0x03) { // 基本校验
uint16_t reg_val = (tmp_buf[9] << 8) | tmp_buf[10]; // 提取寄存器值
LOG_INFO("MODBUS", "Read Register %d OK: 0x%04X", TARGET_REG_ADDR + 40001, reg_val);
/* 🚀 关键步骤:通过 433 无线转发结果 */
uint8_t payload[2]; // 构造 433 负载
payload[0] = tmp_buf[9]; // 寄存器高位
payload[1] = tmp_buf[10]; // 寄存器低位
RF433_SendPacket(PROTO_TYPE_NET, payload, 2); // 打包并通过无线发出
g_state = MODBUS_STATE_IDLE; // 处理完成,返回空闲
g_last_tick = HAL_GetTick(); // 记录本次完成时间
} else { // 响应格式非法
LOG_ERROR("MODBUS", "Invalid response format");
g_state = MODBUS_STATE_IDLE; // 返回空闲
g_last_tick = HAL_GetTick(); // 更新计时
}
break;
default: // 异常保护
g_state = MODBUS_STATE_IDLE;
break;