初版程序
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
#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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef TEST_ECHO_H
|
||||
#define TEST_ECHO_H
|
||||
|
||||
#include "main.h"
|
||||
|
||||
void test_echo_switch(u8 enable);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user