硬汉嵌入式论坛

 找回密码
 立即注册
查看: 374|回复: 2
收起左侧

[ThreadX全家桶] GD32调试NetXDUO遇到的问题

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2025-2-13 15:50:14 | 显示全部楼层 |阅读模式
最近在用国产GD芯片跑ThreadX,调试网口驱动时用NetXDUO遇到了个现象,程序在跑TCP服务端和UDP时都没有问题,在调试TCP客户端连接上位机时nx_tcp_client_socket_connect这个函数一直返回0x21,查了下IP和端口都没有问题,而且电脑和板子也在同一网段,但是连接时就一直返回0x21失败,希望大佬们帮忙看下还可能是哪里的问题。

这里贴下代码:

#define DEFAULT_PORT                    7788    /* TCP服务器监听端口号 */

#define IP_ADDR0                        192
#define IP_ADDR1                        168
#define IP_ADDR2                        28
#define IP_ADDR3                        245

#define  MAX_TCP_CLIENTS                1

#define TCP_SERVER_ADDRESS              IP_ADDRESS(192,168,28,146)
#define TCP_SERVER_PORT                   1001


void NetXTest(void)
{
  UINT status;
  UINT ret;
  ULONG socket_state;
  UINT old_priority;
  
  NX_PACKET *data_packet;
  NX_PACKET *TraPacket;
  NX_PACKET *RecPacket;
  ULONG bytes_read;
  
  ULONG peer_ip_address;
  ULONG peer_port;

  UINT source_port;
  ULONG source_ip_address;  
  
  UINT  count=0;
  /* 初始化NetX */
  nx_system_initialize();
  /* 创建内存池 */
  status =  nx_packet_pool_create(&pool_0,                                       /* 内存池控制块 */
                                  "NetX Main Packet Pool",                      /* 内存池名 */
                                  1536,                                         /* 内存池每个数据包大小,单位字节
                                  此值必须至少为 40 个字节,并且还必须可以被 4 整除 */
                                  (ULONG*)(((int)packet_pool_area + 15) & ~15) ,/* 内存池地址,此地址必须ULONG对齐 */
                                  NX_PACKET_POOL_SIZE);                         /* 内存池大小NX_PACKET_POOL_SIZE */                  
  
  /* 检测创建是否失败 */
  if (status) error_counter++;
  
  /* 例化IP */
  status = nx_ip_create(&ip_0,                                                   /* IP实例控制块 */                                    
                        "NetX IP Instance 0",                                  /* IP实例名 */     
                        IP_ADDRESS(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3),    /* IP地址 */
                        0xFFFFFF00UL,                                          /* 子网掩码 */
                        &pool_0,                                               /* 内存池 */
                        nx_driver_gd,                                                            /* 网卡驱动 */
                        (UCHAR*)AppTaskNetXStk,                                /* IP任务栈地址 */
                        sizeof(AppTaskNetXStk),                                /* IP任务栈大小,单位字节 */
                        APP_CFG_TASK_NETX_PRIO);                               /* IP任务优先级 */
  
  
  /* 检测创建是否失败 */
  if (status) error_counter++;
  
  /* 使能ARP,并提供ARP缓存 */
  status =  nx_arp_enable(&ip_0,                     /* IP实例控制块 */
                          (void *)arp_space_area,    /* ARP缓存地址 */
                          sizeof(arp_space_area));   /* 每个 ARP 条目均为 52 个字节,因此,ARP 条目总数是52字节整数倍 */
  
  /* 使能fragment */   
  status = nx_ip_fragment_enable(&ip_0);
  
  /* 检测使能成功 */
  if (status) error_counter++;
  
  /* 使能TCP */
  status =  nx_tcp_enable(&ip_0);
  
  /* 检测使能成功 */
  if (status) error_counter++;
  
  /* 使能UDP  */
  status =  nx_udp_enable(&ip_0);
  
  /* 检测使能成功 */
  if (status) error_counter++;
  
  /* 使能ICMP */
  status =  nx_icmp_enable(&ip_0);
  
  /* 检测使能成功 */
  if (status) error_counter++;


  /* 创建TCP Socket */
  ret = nx_tcp_socket_create(&ip_0,                 /* IP实例控制块 */   
                             &TCPSocket,            /* TCP控制块 */
                             "TCP Server Socket",   /* TCP Socket名 */
                             NX_IP_NORMAL,          /* IP服务类型 */
                             NX_FRAGMENT_OKAY,      /* 使能IP分段 */
                             NX_IP_TIME_TO_LIVE,    /* 指定一个 8 位的值,用于定义此数据包在被丢弃之前可通过的路由器数目 */
                             4320,                  /* TCP Socket接收队列中允许的最大字节数 */
                             NX_NULL,               /* 用于在接收流中检测到紧急数据时调用的回调函数 */
                             NX_NULL);              /* TCP Socket另一端发出断开连接时调用的回调函数 */
  if (ret)
  {
    count++;
    //Error_Handler(__FILE__, __LINE__);   
  }


  /* 绑定端口 */
  ret = nx_tcp_client_socket_bind(&TCPSocket, DEFAULT_PORT, NX_WAIT_FOREVER);
  if (ret != NX_SUCCESS)
  {
    count++;
//    Error_Handler(__FILE__, __LINE__);
  }
  /* 连接远程服务器 */
  ret = nx_tcp_client_socket_connect(&TCPSocket, TCP_SERVER_ADDRESS, TCP_SERVER_PORT, NX_WAIT_FOREVER);
  if (ret != NX_SUCCESS)
  {
    count++;
//    Error_Handler(__FILE__, __LINE__);
  }


  while(1)
  {
    TX_MEMSET(data_buffer, '\0', sizeof(data_buffer));
    /* 获取 socket 状态 */
    nx_tcp_socket_info_get(&TCPSocket, /* TCP Socket 控制块 */
                           NULL, /* 发送的 TCP 数据包总数目 */
                           NULL, /* 发送的 TCP 总字节数 */
                           NULL, /* 接收 TCP 数据包总数目 */
                           NULL, /* 接收的 TCP 总字节数 */
                           NULL, /* 重新传输的 TCP 数据包总数目 */
                           NULL, /* Socket 上 TCP 排队的 TCP 数据包总数 */
                           NULL, /* Socket 上有校验和错误的 TCP 数据包总数 */
                           &socket_state, /* Socket 当前状态 */
                           NULL, /* 仍在排队等待 ACK 的发送数据包总数 */
                           NULL, /* 当前发送窗口大小 */
                           NULL); /* 当前接收窗口大小 */
    /* 如果连接还没有建立,继续接受新连接,成功的话开启接收数据 */
    if(socket_state != NX_TCP_ESTABLISHED)
    {
      /* 绑定端口 */
      ret = nx_tcp_client_socket_bind(&TCPSocket, DEFAULT_PORT, NX_WAIT_FOREVER);
      if (ret != NX_SUCCESS)
      {
//        Error_Handler(__FILE__, __LINE__);
      }
      /* 连接远程服务器 */
      ret = nx_tcp_client_socket_connect(&TCPSocket, TCP_SERVER_ADDRESS, TCP_SERVER_PORT, NX_WAIT_FOREVER);
      if (ret != NX_SUCCESS)
      {
//        Error_Handler(__FILE__, __LINE__);
      }
    }
   
    if((socket_state == NX_TCP_ESTABLISHED)&&(ret == NX_SUCCESS))
    {
      
      /* 接收 TCP 客户端发的 TCP 数据包 */
      ret = nx_tcp_socket_receive(&TCPSocket, /* TCP Socket 控制块 */
                                  &RecPacket, /* 接收到的数据包 */
                                  NX_WAIT_FOREVER); /* 永久等待 */
      if (ret == NX_SUCCESS)
      {
        
        /* 获取客户端的 IP 地址和端口 */
        nx_tcp_socket_peer_info_get(&TCPSocket, /* TCP Socket 控制块 */
                                    &peer_ip_address, /* 远程 IP 地址 */
                                    &peer_port); /* 远程端口号 */
        /* 获取客户端发来的数据 */
        nx_packet_data_retrieve(RecPacket, /* 接收到的数据包 */
                                data_buffer, /* 解析出数据 */
                                &bytes_read); /* 数据大小 */
        /* 打印接收到数据 */
        //PRINT_DATA(peer_ip_address, (unsigned int)peer_port, data_buffer);
        nx_packet_release(RecPacket);
        
        /* 申请发送数据包 */
        ret = nx_packet_allocate(&pool_0, &TraPacket, NX_TCP_PACKET, TX_WAIT_FOREVER);
        if (ret)
        {
//          Error_Handler(__FILE__, __LINE__);
        }
//        sprintf((char *)sendbuf, "sendbuf = %d\r\n", count++);
        
        /*将要发送的数据附加到 TraPacket */
        ret = nx_packet_data_append(TraPacket, (VOID *)tcpsendtest, strlen((char *)tcpsendtest),
                                    &pool_0, TX_WAIT_FOREVER);
        if (ret)
        {
//          Error_Handler(__FILE__, __LINE__);
        }
        
        /* 发送数据,注意发送后,此函数会释放数据包 */
        ret = nx_tcp_socket_send(&TCPSocket,
                                 TraPacket,
                                 NX_WAIT_FOREVER);
        
        
        if (ret)
        {
          //Error_Handler(__FILE__, __LINE__);
        }
        
      }
      else
      {
        /* 释放数据包 */
        nx_packet_release(RecPacket);
        
        /* 断开连接 */
        nx_tcp_socket_disconnect(&TCPSocket,
                                 NX_WAIT_FOREVER);
        /* disconnect the socket */
        nx_tcp_client_socket_unbind(&TCPSocket);
      }
    }
  }

}
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2025-2-13 19:36:45 | 显示全部楼层
用这个函数nxd_tcp_client_socket_connect替换nx_tcp_client_socket_connect试试,你用的函数参考手册已经不推荐了
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2025-2-13 19:44:44 | 显示全部楼层
参考这个代码试试
ret =  nx_tcp_client_socket_bind(&TCPSocket, tcp_client_port, NX_WAIT_FOREVER);  
        if (ret != NX_SUCCESS)
        {
            //Error_Handler();
        }
        peer_ip_address.nxd_ip_version = NX_IP_VERSION_V4;
        peer_ip_address.nxd_ip_address.v4 = IP_ADDRESS(tcpserver_ip_address[0],tcpserver_ip_address[1],tcpserver_ip_address[2],tcpserver_ip_address[3]);
        /* connect to the remote server on the specified port */  /*nxd_tcp_client_socket_connect ipv4 or ipv6*/
        if(nxd_tcp_client_socket_connect(&TCPSocket, &peer_ip_address,tcp_server_port, TCP_CONNECTION_PERIOD) != NX_SUCCESS)
{
//Error_Handler();
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 21:24 , Processed in 0.235112 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表