#include "tcpserverc.h" #include "lwip/netif.h" #include "lwip/ip.h" #include "lwip/tcp.h" #include "lwip/init.h" #include "netif/etharp.h" #include "lwip/udp.h" #include "lwip/pbuf.h" #include #include #include "usart.h" #include "main.h" #include "ht1200m.h" struct tcp_pcb *server_pcb1 = NULL; struct tcp_pcb *server_pcb2 = NULL; extern uint8_t tcp_echo_flags; extern uint8_t tcp_echo_flags_hart2; /*接收回调函数*/ static err_t tcpecho_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { // 对应接收数据连接的控制块 接收到的数据 if (p != NULL) { /* 更新窗口*/ tcp_echo_flags = 1; tcp_recved(tpcb, p->tot_len); // 读取数据的控制块 得到所有数据的长度 memcpy(&server_pcb1, &tpcb, sizeof(struct tcp_pcb *)); #if 0 memcpy(hart2_uart2.tx_data, (int *)p->payload, p->tot_len); HART2_RTS_SEND; HAL_UART_Transmit(&huart2, hart2_uart2.tx_data, p->tot_len, 1000); HART2_RTS_RECEIVE; #endif #if 1 memcpy(hart1_uart5.tx_data, (int *)p->payload, p->tot_len); HART1_RTS_SEND; HAL_UART_Transmit(&huart5, hart1_uart5.tx_data, p->tot_len, 100); HART1_RTS_RECEIVE; #endif #if 0 memcpy(ble1_uart6.tx_data, (int *)p->payload, p->tot_len); dma_usart_send(&huart6, ble1_uart6.tx_data, p->tot_len); #endif #if 0 memcpy(ble2_uart3.tx_data, (int *)p->payload, p->tot_len); dma_usart_send(&huart3, ble2_uart3.tx_data, p->tot_len); #endif #if 0 memcpy(lcd_uart4.tx_data, (int *)p->payload, p->tot_len); dma_usart_send(&huart4, lcd_uart4.tx_data, p->tot_len); #endif memset(p->payload, 0, p->tot_len); pbuf_free(p); } else if (err == ERR_OK) // 检测到对方主动关闭连接时,也会调用recv函数,此时p为空 { return tcp_close(tpcb); } return ERR_OK; } static err_t tcpecho_recv_hart2(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { // 对应接收数据连接的控制块 接收到的数据 if (p != NULL) { /* 更新窗口*/ tcp_echo_flags_hart2 = 1; tcp_recved(tpcb, p->tot_len); // 读取数据的控制块 得到所有数据的长度 memcpy(&server_pcb2, &tpcb, sizeof(struct tcp_pcb *)); #if 1 memcpy(hart2_uart2.tx_data, (int *)p->payload, p->tot_len); HART2_RTS_SEND; HAL_UART_Transmit(&huart2, hart2_uart2.tx_data, p->tot_len, 1000); HART2_RTS_RECEIVE; #endif #if 0 memcpy(hart1_uart5.tx_data, (int *)p->payload, p->tot_len); HART1_RTS_SEND; HAL_UART_Transmit(&huart5, hart1_uart5.tx_data, p->tot_len, 100); HART1_RTS_RECEIVE; #endif #if 0 memcpy(ble1_uart6.tx_data, (int *)p->payload, p->tot_len); dma_usart_send(&huart6, ble1_uart6.tx_data, p->tot_len); #endif #if 0 memcpy(ble2_uart3.tx_data, (int *)p->payload, p->tot_len); dma_usart_send(&huart3, ble2_uart3.tx_data, p->tot_len); #endif #if 0 memcpy(lcd_uart4.tx_data, (int *)p->payload, p->tot_len); dma_usart_send(&huart4, lcd_uart4.tx_data, p->tot_len); #endif memset(p->payload, 0, p->tot_len); pbuf_free(p); } else if (err == ERR_OK) // 检测到对方主动关闭连接时,也会调用recv函数,此时p为空 { return tcp_close(tpcb); } return ERR_OK; } static err_t tcpecho_accept(void *arg, struct tcp_pcb *newpcb, err_t err) // 由于这个函数是*tcp_accept_fn类型的 // 形参的数量和类型必须一致 { tcp_recv(newpcb, tcpecho_recv); // 当收到数据时,回调用户自己写的tcpecho_recv return ERR_OK; } static err_t tcpecho_accept_hart2(void *arg, struct tcp_pcb *newpcb, err_t err) // 由于这个函数是*tcp_accept_fn类型的 // 形参的数量和类型必须一致 { tcp_recv(newpcb, tcpecho_recv_hart2); // 当收到数据时,回调用户自己写的tcpecho_recv return ERR_OK; } void tcp_echo_init(void) { struct tcp_pcb *server_pcb_hart1 = NULL; struct tcp_pcb *server_pcb_hart2 = NULL; /* 创建一个TCP控制块 */ server_pcb_hart1 = tcp_new(); /* 绑定TCP控制块 */ tcp_bind(server_pcb_hart1, IP_ADDR_ANY, TCP_PORT_HART1); /* 进入监听状态 */ server_pcb_hart1 = tcp_listen(server_pcb_hart1); /* 处理连接 注册函数,侦听到连接时被注册的函数被回调 */ tcp_accept(server_pcb_hart1, tcpecho_accept); // 侦听到连接后,回调用户编写的tcpecho_accept /*************************************************************************/ /* 创建一个TCP控制块 */ server_pcb_hart2 = tcp_new(); /* 绑定TCP控制块 */ tcp_bind(server_pcb_hart2, IP_ADDR_ANY, TCP_PORT_HART2); /* 进入监听状态 */ server_pcb_hart2 = tcp_listen(server_pcb_hart2); /* 处理连接 注册函数,侦听到连接时被注册的函数被回调 */ tcp_accept(server_pcb_hart2, tcpecho_accept_hart2); // 侦听到连接后,回调用户编写的tcpecho_accept } void user_send_data(uint8_t *data, uint16_t len) { if (tcp_echo_flags == 1) { tcp_write(server_pcb1, data, len, 1); } } void user_send_data_hart2(uint8_t *data, uint16_t len) { if (tcp_echo_flags_hart2 == 1) { tcp_write(server_pcb2, data, len, 1); } } // #include "lwip/tcp.h" // #include "lwip/pbuf.h" // #include "lwip/err.h" // #include "lwip/sys.h" // #include "stm32f4xx_hal.h" // 根据具体的 STM32 系列修改头文件 // // 定义多个端口号 // #define PORT1 5000 // #define PORT2 6000 // // 定义 TCP 连接状态 // enum tcp_states { // TCP_STATE_CLOSED, // TCP_STATE_LISTEN, // TCP_STATE_CONNECTED // }; // // 定义 TCP 连接结构体 // struct tcp_connection { // struct tcp_pcb *pcb; // enum tcp_states state; // }; // // TCP 接收回调函数 // static err_t tcp_recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { // if (err == ERR_OK && p!= NULL) { // // 打印接收到的数据 // for (u16_t i = 0; i < p->len; i++) { // printf("Received on TCP: %c", ((char *)p->payload)[i]); // } // printf("\n"); // // 释放接收缓冲区 // pbuf_free(p); // } // return ERR_OK; // } // // TCP 错误回调函数 // static void tcp_err_callback(void *arg, err_t err) { // struct tcp_connection *conn = (struct tcp_connection *)arg; // if (conn->pcb!= NULL) { // tcp_close(conn->pcb); // mem_free(conn); // } // } // // TCP 连接回调函数 // static err_t tcp_accept_callback(void *arg, struct tcp_pcb *pcb, err_t err) { // struct tcp_connection *conn = (struct tcp_connection *)mem_malloc(sizeof(struct tcp_connection)); // if (conn == NULL) { // tcp_close(pcb); // return ERR_MEM; // } // conn->pcb = pcb; // conn->state = TCP_STATE_CONNECTED; // tcp_arg(pcb, conn); // tcp_recv(pcb, tcp_recv_callback); // tcp_err(pcb, tcp_err_callback); // return ERR_OK; // } // int main(void) { // struct tcp_pcb *pcb1; // struct tcp_pcb *pcb2; // struct tcp_connection *conn1; // struct tcp_connection *conn2; // // 初始化 STM32 硬件(例如以太网) // HAL_Init(); // // 初始化 LwIP 协议栈 // lwip_init(); // // 创建第一个 TCP PCB // pcb1 = tcp_new(); // if (pcb1 == NULL) { // printf("Error creating TCP PCB1\n"); // return -1; // } // if (tcp_bind(pcb1, IP_ADDR_ANY, PORT1)!= ERR_OK) { // printf("Error binding TCP PCB1 to port %d\n", PORT1); // tcp_close(pcb1); // return -1; // } // pcb1 = tcp_listen(pcb1); // conn1 = mem_malloc(sizeof(struct tcp_connection)); // if (conn1 == NULL) { // tcp_close(pcb1); // return -1; // } // conn1->pcb = pcb1; // conn1->state = TCP_STATE_LISTEN; // tcp_arg(pcb1, conn1); // tcp_accept(pcb1, tcp_accept_callback); // // 创建第二个 TCP PCB // pcb2 = tcp_new(); // if (pcb2 == NULL) { // printf("Error creating TCP PCB2\n"); // return -1; // } // if (tcp_bind(pcb2, IP_ADDR_ANY, PORT2)!= ERR_OK) { // printf("Error binding TCP PCB2 to port %d\n", PORT2); // tcp_close(pcb2); // return -1; // } // pcb2 = tcp_listen(pcb2); // conn2 = mem_malloc(sizeof(struct tcp_connection)); // if (conn2 == NULL) { // tcp_close(pcb2); // return -1; // } // conn2->pcb = pcb2; // conn2->state = TCP_STATE_LISTEN; // tcp_arg(pcb2, conn2); // tcp_accept(pcb2, tcp_accept_callback); // while (1) { // // 主循环中处理系统超时和其他任务 // sys_check_timeouts(); // } // return 0; // }