#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; } }