完成了使485输出的数据可以被上位机解析
This commit is contained in:
@ -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
|
||||
|
||||
Reference in New Issue
Block a user