77 lines
2.3 KiB
C
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;
|
|
}
|
|
}
|