完成了使485输出的数据可以被上位机解析

This commit is contained in:
2026-05-08 09:45:08 +08:00
parent f05c3106f1
commit c9989b3e6a
74 changed files with 787 additions and 755 deletions

View File

@ -238,6 +238,8 @@ int main(void)
/* Infinite loop */
/* USER CODE BEGIN WHILE */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
@ -253,7 +255,7 @@ int main(void)
/* === 3. 极速无乱码透传 === */
/* === 方案 A从 433 收到无线数据 -> 拆包提取ID -> 纯净透传给 485 === */
/* === 方案 A从 433 收到无线数据 -> 给上位机解析 === */
if (u1_rx_len > 0 && (HAL_GetTick() - u1_last_rx_time > 20))
{
static uint8_t temp_buf1[256];
@ -263,28 +265,62 @@ int main(void)
u1_rx_len = 0;
__enable_irq();
/* 🚀 解析“快递单”检查数据长度并且第0个字节必须是我们定义的魔法帧头 0xAA */
/* 🚀 终极上位机协议:[0xAA帧头] + [设备ID] + [来源接口] + [数据长度] + [纯净数据] */
if (len >= 2 && temp_buf1[0] == 0xAA)
{
uint8_t sender_id = temp_buf1[1]; // 提取发件人的身份证
uint16_t real_len = len - 2; // 扒掉2个字节的衣服后真实数据的长度
uint8_t* real_data = &temp_buf1[2]; // 真实数据的起始指针
uint8_t sender_id = temp_buf1[1];
uint16_t payload_len = len - 2;
uint8_t* payload_data = &temp_buf1[2];
/* 默认 0x03 为 RS485 透传数据 */
uint8_t source_type = 0x03;
/* ==========================================================
🚀 核心修复:直接对比底层字节,抛弃 strncmp
同时兼容你可能忘了烧录新代码的旧版 $DI 协议!
========================================================== */
/* 判断是不是新版 [DI] 标签 */
if (payload_len >= 4 && payload_data[0] == '[' && payload_data[1] == 'D' && payload_data[2] == 'I' && payload_data[3] == ']')
{
source_type = 0x01; /* 0x01 代表是 DI 口触发的数据 */
payload_data += 4; /* 砍掉 "[DI]" 标签 */
payload_len -= 4;
}
/* 判断是不是旧版 $DI 标签 (防止远端发送板没烧录最新代码) */
else if (payload_len >= 3 && payload_data[0] == '$' && payload_data[1] == 'D' && payload_data[2] == 'I')
{
source_type = 0x01; /* 也是 DI 口数据,但不砍标签了,直接全发过去 */
}
/* 判断是不是网口 [NET] 标签 */
else if (payload_len >= 5 && payload_data[0] == '[' && payload_data[1] == 'N' && payload_data[2] == 'E' && payload_data[3] == 'T' && payload_data[4] == ']')
{
source_type = 0x02; /* 0x02 代表是 网络口 收到的数据 */
payload_data += 5; /* 砍掉 "[NET]" 标签 */
payload_len -= 5;
}
/* ========================================================== */
/* 【追踪器】打印出来:知道是哪个设备发来的! */
printf("\r\n[DEBUG] 收到来自 设备[%d] 的消息, 有效数据长度: %d 字节!\r\n", sender_id, real_len);
/* 只把干净的真实数据发给 485 设备,绝不能把 0xAA 和 ID 发给 485否则外部设备会乱码 */
if (real_len > 0) {
MultiUART_Send(PORT_UART3, real_data, real_len);
MultiUART_Send(PORT_UART2, real_data, real_len); // 电脑监控原始数据
if (payload_len > 0) {
/* 重新组装终极协议帧 */
uint8_t upper_buf[260];
upper_buf[0] = 0xAA; // Byte 0: 魔法帧头
upper_buf[1] = sender_id; // Byte 1: 发送设备 ID
upper_buf[2] = source_type; // Byte 2: 数据来源 (1=DI, 2=NET, 3=485)
upper_buf[3] = (uint8_t)payload_len; // Byte 3: 真实数据长度
memcpy(&upper_buf[4], payload_data, payload_len); // Byte 4~末尾: 绝对纯净的数据
/* 发送给 485 和电脑上位机 */
MultiUART_Send(PORT_UART3, upper_buf, payload_len + 4);
MultiUART_Send(PORT_UART2, upper_buf, payload_len + 4);
}
}
else
{
/* 如果没有匹配上帧头(比如收到了环境干扰乱码),直接按原样丢弃或透传 */
/* 普通无帧头干扰数据,按原样透传 */
MultiUART_Send(PORT_UART3, temp_buf1, len);
MultiUART_Send(PORT_UART2, temp_buf1, len);
}
}
/* === 方案 B从 485 收到设备数据 -> 穿上包装(附加ID) -> 通过 433 无线发射 === */
if (u3_rx_len > 0 && (HAL_GetTick() - u3_last_rx_time > 20))
@ -302,15 +338,15 @@ int main(void)
rf_tx_buf[1] = MY_DEVICE_ID; // 贴上本机的身份证号
memcpy(&rf_tx_buf[2], temp_buf3, len); // 把 485 收到的真实数据塞进后面
/* 把带有身份证的完整包裹,通过 433 发射到空气中 (长度要 +2) */
/* 把带有身份证的完整包裹,通过 433 发射到空气中 */
MultiUART_Send(PORT_UART1, rf_tx_buf, len + 2);
}
/* USER CODE END WHILE */
}
/* USER CODE END 3 */
/* USER CODE END 3 */
}
}
/* USER CODE END 3 */
/**
* @brief System Clock Configuration
* @retval None