初步测试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

@ -73,7 +73,7 @@ extern "C" {
🚀 核心身份标识:烧录不同设备时,请务必修改这个数字!
比如设备A烧录时改为 0x01设备B烧录时改为 0x02
========================================================= */
#define MY_DEVICE_ID 0x02
#define MY_DEVICE_ID 101
/* =========================================================
🚀 开发调试开关

View File

@ -32,7 +32,6 @@ typedef enum {
MODBUS_STATE_CONNECTING,
MODBUS_STATE_SEND_QUERY,
MODBUS_STATE_WAIT_RESPONSE,
MODBUS_STATE_PROCESS_DATA,
MODBUS_STATE_ERROR_RETRY
} modbus_client_state_t;
@ -47,4 +46,10 @@ void ModbusTCP_Client_Init(uint8_t sn);
*/
void ModbusTCP_Client_Task(void);
/**
* @brief 获取最新成功读取的 Modbus 寄存器值
* @retval 16位寄存器值 (未读到时默认返回 0xFFFF)
*/
uint16_t ModbusTCP_Get_LastRegVal(void);
#endif

View File

@ -388,13 +388,21 @@ int main(void)
#if USE_IO_MONITOR
if (HAL_GetTick() - g_last_hb_tick >= 30000) {
g_last_hb_tick = HAL_GetTick();
uint8_t hb_payload[3];
uint8_t hb_payload[5]; // 扩充为 5 字节
hb_payload[0] = IO_Monitor_GetAllStates();
hb_payload[1] = (uint8_t)(g_hb_seq >> 8);
hb_payload[2] = (uint8_t)(g_hb_seq & 0xFF);
uint16_t modbus_val = 0xFFFF; // 默认值
#if USE_W5500
modbus_val = ModbusTCP_Get_LastRegVal(); // 获取最新 Modbus 寄存器值
#endif
hb_payload[3] = (uint8_t)(modbus_val >> 8);
hb_payload[4] = (uint8_t)(modbus_val & 0xFF);
g_hb_seq++;
RF433_SendPacket(PROTO_TYPE_HB, hb_payload, 3);
RF433_SendPacket(PROTO_TYPE_HB, hb_payload, 5); // 发送 5 字节
}
#endif

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;

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -18,7 +18,7 @@
wiz_NetInfo default_net_info = {
.mac = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12},
#if TEST_A701
.ip = {192, 168, 6, 7},
.ip = {192, 168, 6, 212},
.gw = {192, 168, 6, 1},
#else
.ip = {192, 168, 0, 5},