初步测试OK
This commit is contained in:
@ -73,7 +73,7 @@ extern "C" {
|
||||
🚀 核心身份标识:烧录不同设备时,请务必修改这个数字!
|
||||
比如:设备A烧录时改为 0x01,设备B烧录时改为 0x02
|
||||
========================================================= */
|
||||
#define MY_DEVICE_ID 0x02
|
||||
#define MY_DEVICE_ID 101
|
||||
|
||||
/* =========================================================
|
||||
🚀 开发调试开关
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
8510
MDK-ARM/JLinkLog.txt
8510
MDK-ARM/JLinkLog.txt
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -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},
|
||||
|
||||
Reference in New Issue
Block a user