STM32 F746ZG的LwIP netconn客户端TCP连接失败求助
TCP客户端无法通过LwIP netconn API建立连接问题
背景信息
- 硬件:两块STM32F746ZG开发板
- 协议栈:STM官方LwIP协议栈,使用netconn API
- 网络配置:设备通过DHCP获取固定IP,地址符合预期,设备可正常被ping通
- 问题现象:客户端无法建立TCP连接,Wireshark未捕获到连接请求;PC端用Hercules搭建TCP服务器也无法连接;但另一块开发板的服务器端运行正常,可被Hercules连接收发数据,排除协议栈本身问题
- 怀疑点:netconn_bind的使用存在错误,不确定客户端应绑定的IP地址
客户端代码
static void tcpecho_client_thread(void const *arg) { struct netconn *xNetConn = NULL; err_t bind_err, connect_err; char* b_data = "OK"; // Data to be sent uint16_t b_len = sizeof ( b_data ); IP4_ADDR(&local_ip, IP_ADDR0_CLIENT, IP_ADDR1_CLIENT, IP_ADDR2_CLIENT, IP_ADDR3_CLIENT); IP4_ADDR(&pc_ip, IP_ADDR0_PC, IP_ADDR0_PC, IP_ADDR2_PC, IP_ADDR3_PC); xNetConn = netconn_new ( NETCONN_TCP ); if (xNetConn != NULL){ bind_err = netconn_bind ( xNetConn, &local_ip, TCP_PORT_NETCONN ); if(bind_err == ERR_OK){ // Try to connect to server for(;;){ connect_err = netconn_connect ( xNetConn, &pc_ip, TCP_PORT_NETCONN); if (connect_err == ERR_OK){ // We are connected while(1){ BSP_LED_On(LED1); netconn_write(xNetConn, b_data, b_len, NETCONN_COPY); vTaskDelay(1000); // To see the result easily in Comm Operator } } } }else{ // Failed to bind the connection BSP_LED_On(LED3); } }else{ // Failed to allocate a new connection BSP_LED_On(LED3); } }
问题分析与修复方案
1. 客户端绑定IP的错误
你的设备通过DHCP获取IP,但代码中硬编码了local_ip,导致绑定的IP与DHCP分配的实际IP不一致,协议栈无法正确发送连接请求。客户端通常无需手动绑定固定IP和端口,LwIP会自动选择合适的本地端口和IP。
修复方式:
- 直接删除
netconn_bind调用,客户端发起连接时LwIP会自动处理本地IP和端口的选择; - 若必须绑定,使用
IP_ADDR_ANY让协议栈适配当前设备的IP:bind_err = netconn_bind(xNetConn, IP_ADDR_ANY, TCP_PORT_NETCONN);
2. 服务器IP配置错误
代码中IP4_ADDR(&pc_ip, IP_ADDR0_PC, IP_ADDR0_PC, IP_ADDR2_PC, IP_ADDR3_PC)的第二个参数重复使用了IP_ADDR0_PC,应改为IP_ADDR1_PC,否则服务器IP地址错误,无法建立连接。
3. 数据长度计算错误
b_len = sizeof(b_data)是错误的,b_data是指针,sizeof得到的是指针长度(4或8字节),而非字符串实际长度,应改为:
uint16_t b_len = strlen(b_data);
修复后的客户端代码示例
static void tcpecho_client_thread(void const *arg) { struct netconn *xNetConn = NULL; err_t connect_err; char* b_data = "OK"; // 待发送数据 uint16_t b_len = strlen(b_data); // 修正字符串长度计算 IP4_ADDR(&pc_ip, IP_ADDR0_PC, IP_ADDR1_PC, IP_ADDR2_PC, IP_ADDR3_PC); // 修正服务器IP配置 xNetConn = netconn_new(NETCONN_TCP); if (xNetConn != NULL){ // 客户端无需手动绑定,直接发起连接 for(;;){ connect_err = netconn_connect(xNetConn, &pc_ip, TCP_PORT_NETCONN); if (connect_err == ERR_OK){ BSP_LED_On(LED1); while(1){ netconn_write(xNetConn, b_data, b_len, NETCONN_COPY); vTaskDelay(1000); } } else { BSP_LED_Off(LED1); vTaskDelay(500); // 连接失败后延时重试,避免占用过多CPU } } } else { // 连接分配失败 BSP_LED_On(LED3); } }
内容的提问来源于stack exchange,提问作者Necrotos
相关产品推荐
相关产品推荐

