diff --git a/Core/Inc/main.h b/Core/Inc/main.h index f1c3266..18bd3f0 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -42,6 +42,7 @@ extern "C" /* Exported types ------------------------------------------------------------*/ /* USER CODE BEGIN ET */ extern uint8_t tcp_echo_flags; // 标志位,连接成功置1 +extern uint8_t tcp_echo_flags_hart2; // 标志位,连接成功置1 #define ARRAY_LEN(arr) (sizeof(arr)) / (sizeof(arr[0])) typedef struct { diff --git a/Core/Src/main.c b/Core/Src/main.c index 4e841fd..739aa1c 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -71,6 +71,7 @@ uart_t hart2_uart2 = {0}; uart_t hart1_uart5 = {0}; float current_buff[2] = {12.0f, 12.0f}; uint8_t tcp_echo_flags = 0; +uint8_t tcp_echo_flags_hart2 = 0; /* USER CODE END 0 */ /** diff --git a/Core/Src/stm32f4xx_it.c b/Core/Src/stm32f4xx_it.c index ef2449a..6dc13cf 100644 --- a/Core/Src/stm32f4xx_it.c +++ b/Core/Src/stm32f4xx_it.c @@ -34,6 +34,7 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ extern struct tcp_pcb *server_pcb1; +extern struct tcp_pcb *server_pcb2; /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -327,9 +328,9 @@ void USART2_IRQHandler(void) // 空闲中断 if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET) { - if (tcp_echo_flags == 1) + if (tcp_echo_flags_hart2 == 1) { - user_send_data(hart2_uart2.rx_data, hart2_uart2.rx_num); + user_send_data_hart2(hart2_uart2.rx_data, hart2_uart2.rx_num); } hart2_uart2.rx_num = 0; __HAL_UART_CLEAR_IDLEFLAG(&huart2); diff --git a/MDK-ARM/TEST2.uvoptx b/MDK-ARM/TEST2.uvoptx index 761757b..a476ff9 100644 --- a/MDK-ARM/TEST2.uvoptx +++ b/MDK-ARM/TEST2.uvoptx @@ -148,7 +148,24 @@ -UB -O2254 -SF1800 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM) - + + + 0 + 0 + 117 + 1 +
134252704
+ 0 + 0 + 0 + 0 + 0 + 1 + ../Core/Src/main.c + + \\TEST2\../Core/Src/main.c\117 +
+
0 diff --git a/User/application/inc/tcpserverc.h b/User/application/inc/tcpserverc.h index 34445bf..1b23e5a 100644 --- a/User/application/inc/tcpserverc.h +++ b/User/application/inc/tcpserverc.h @@ -3,8 +3,10 @@ #include "main.h" -#define TCP_ECHO_PORT 5001 +#define TCP_PORT_HART1 5001 +#define TCP_PORT_HART2 5002 extern void tcp_echo_init(void); extern void user_send_data(uint8_t *data, uint16_t len); +extern void user_send_data_hart2(uint8_t *data, uint16_t len); #endif diff --git a/User/application/src/tcpserverc.c b/User/application/src/tcpserverc.c index 48c1628..f9b5a2b 100644 --- a/User/application/src/tcpserverc.c +++ b/User/application/src/tcpserverc.c @@ -12,7 +12,9 @@ #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) { // ӦӵĿƿ յ @@ -56,6 +58,48 @@ static err_t tcpecho_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t 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); // ȡݵĿƿ õݵij + 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͵ // βεͱһ { @@ -64,20 +108,40 @@ static err_t tcpecho_accept(void *arg, struct tcp_pcb *newpcb, err_t err) // 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 = NULL; + struct tcp_pcb *server_pcb_hart1 = NULL; + struct tcp_pcb *server_pcb_hart2 = NULL; /* һTCPƿ */ - server_pcb = tcp_new(); + server_pcb_hart1 = tcp_new(); /* TCPƿ */ - tcp_bind(server_pcb, IP_ADDR_ANY, TCP_ECHO_PORT); + tcp_bind(server_pcb_hart1, IP_ADDR_ANY, TCP_PORT_HART1); /* ״̬ */ - server_pcb = tcp_listen(server_pcb); + server_pcb_hart1 = tcp_listen(server_pcb_hart1); /* עắʱעĺص */ - tcp_accept(server_pcb, tcpecho_accept); // Ӻ󣬻صûдtcpecho_accept + 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) @@ -87,3 +151,133 @@ void user_send_data(uint8_t *data, uint16_t len) 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; +// }