You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:45:33