Files
secs2-SJ/usr/debug/test_echo.c
T
2026-09-09 14:54:40 +08:00

77 lines
2.3 KiB
C

#include "test_echo.h"
#include "bsp_Uart.h"
#include "bsp_W5500.h"
#include "bsp_W5500_1.h"
#include "bsp_Led.h"
#include "proto_Para_Modbus.h"
/* 保存原有回调函数指针 */
static void (*saved_uart1_rx)(u8*, u16, void*) = NULL;
static void (*saved_uart3_rx)(u8*, u16, void*) = NULL;
static void (*saved_W5500_rx)(bsp_W5500_Class_t*, u8*, u16) = NULL;
static void (*saved_w5500_1_rx)(bsp_W5500_Class_t*, u8*, u16) = NULL;
static u8 cnt = 0;
/* 智能回显 + Modbus 解析 */
static void echo_uart_rx(u8 *pData, u16 Len, void *other_data) {
bsp_Uart_t *pUart = (bsp_Uart_t*)other_data;
if (!pUart || !pData || Len == 0) return;
// 检查是否为 Modbus 帧(最小长度8,且CRC校验通过)
ModbusAnalysisData_t modbus_data;
if (Len >= 8 && ModbusAnalysis(&modbus_data, pData, Len) == 1) {
// 是有效的 Modbus 帧,交由 Modbus 处理
Para_Modbus.DataAnalysis(pData, Len, other_data);
return;
}
// 非 Modbus 数据,原样回显
pUart->Send(pUart, pData, Len);
}
/* W5500 回显 */
static void echo_w5500_rx(bsp_W5500_Class_t *pClass, u8 *pData, u16 Len)
{
if (pClass && pData && Len) {
if (pClass == &W5500.W5500_Class[0]) {
W5500.Socket_Send(pClass, pData, Len);
}
else if (pClass == &W5500_1.W5500_Class[0]) {
W5500_1.Socket_Send(pClass, pData, Len);
}
}
}
/* 切换测试模式 */
void test_echo_switch(uint8_t enable) {
if(enable == 2)
{
return;
}
if (enable == 1 && cnt == 0) {
// 保存原有回调
saved_uart1_rx = COM_Uart1.Rx_DataAnalysis;
saved_uart3_rx = COM_Uart3.Rx_DataAnalysis;
saved_W5500_rx = W5500.W5500_Class[0].Rx_DataAnalysis;
saved_w5500_1_rx = W5500_1.W5500_Class[0].Rx_DataAnalysis;
// 设置为智能回显(支持Modbus解析)
COM_Uart1.Rx_DataAnalysis = echo_uart_rx;
COM_Uart3.Rx_DataAnalysis = echo_uart_rx;
W5500.W5500_Class[0].Rx_DataAnalysis = echo_w5500_rx;
W5500_1.W5500_Class[0].Rx_DataAnalysis = echo_w5500_rx;
cnt = 1;
} else if(enable == 0 && cnt == 1){
// 恢复原有回调
COM_Uart1.Rx_DataAnalysis = saved_uart1_rx;
COM_Uart3.Rx_DataAnalysis = saved_uart3_rx;
W5500.W5500_Class[0].Rx_DataAnalysis = saved_W5500_rx;
W5500_1.W5500_Class[0].Rx_DataAnalysis = saved_w5500_1_rx;
cnt = 0;
}
}