硬汉嵌入式论坛

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

[LwIP] UDP通信错误

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2022-7-27 11:32:39 | 显示全部楼层 |阅读模式
最近在使用AWR2944EVM,想通过UDP将点云数据发送到PC上处理。在使用UDP时遇到了如下问题
1.我关闭了lwip DHCP和autoIP相关的宏定义,使用静态IP,详见代码。
2.通过netconn_bind和netconn_connect使pcb与本地IP和远端的IP进行绑定,函数执行的返回值err均为err_ok
3.使用udp_send()发送测试所用的数据,当程序执行到这时,失去响应;(注:在执行到udp_send()之前,可以在命令行ping通板子,但执行到该函数之后就ping不通了)
通过串口打印的信息可知,conn->pcb.udp的localIP,localport,remoteIP,remoteport均已正确配置,所发送的测试数据也可以正常从pbuf->payload指向的地址中通过串口打印
请各位帮忙看一下,哪里出了问题,谢谢
[C] 纯文本查看 复制代码
static void 
tcpclient_thread(void *arg)
{

  struct netconn *conn;
  err_t err;
  LWIP_UNUSED_ARG(arg);
  /* Bind connection to well known port number 7. */
#if LWIP_IPV6
  conn = netconn_new(NETCONN_TCP_IPV6);
  netconn_bind(conn, IP6_ADDR_ANY, 9509);
#else /* LWIP_IPV6 */
  conn = netconn_new(NETCONN_UDP);
  err= netconn_bind(conn, &gMmwMssMCB.enetCfg.localIp, 9509);
  CLI_write("bind err=%d\r\n",err);
  if_localIp_set = true;
#endif /* LWIP_IPV6 */
  LWIP_ERROR("tcpecho: invalid conn", (conn != NULL), return;);
  CLI_write("tcpclient_thread\r\n");
  uint32_t my_udp_testbuf[5];
  my_udp_testbuf[0]=0;
  my_udp_testbuf[1]=1;
  my_udp_testbuf[2]=2;
  my_udp_testbuf[3]=3;
  my_udp_testbuf[4]=4;
  ClockP_usleep(2000000);
  SemaphoreP_pend(&gMmwMssMCB.enetCfg.EnetCfgDoneSemHandle, SystemP_WAIT_FOREVER);
  CLI_write("Enet Semaphore Posted !!\r\n");
  printf("Enet Semaphore Posted !!\n");
  const ip_addr_t test_local_ip = gMmwMssMCB.enetCfg.remoteIp;     //remoteIP
  CLI_write("test local ip set\r\n");
  err = netconn_connect(conn, &test_local_ip ,9509);
  CLI_write("connect err=%d\r\n",err);
  CLI_write ("Local IP is: %s\r\n", ip4addr_ntoa((const ip4_addr_t *)&gMmwMssMCB.enetCfg.localIp));
  CLI_write("Remote IP Address is %s\r\n", ip4addr_ntoa(&gMmwMssMCB.enetCfg.remoteIp));
  if(conn->pcb.udp==NULL)
  {
    CLI_write("pcb.udp equals to NULL\r\n");
  }
  CLI_write("localIP:%s\r\n",ip4addr_ntoa((const ip4_addr_t *)&conn->pcb.udp->local_ip));     //LOCALip
  CLI_write("localport:%d\r\n",conn->pcb.udp->local_port);     //LOCALPORT
  CLI_write("remoteIP:%s\r\n",ip4addr_ntoa((const ip4_addr_t *)&conn->pcb.udp->remote_ip));     //REMOTEIP
  CLI_write("remoteport:%d\r\n",conn->pcb.udp->remote_port);     //REMOTEPORT
  CLI_write("netifindex=%d\r\n",conn->pcb.udp->netif_idx);
  CLI_write("so_options=%d\r\n",conn->pcb.udp->so_options);
  CLI_write("types of serve:%d\r\n",conn->pcb.udp->tos);
  CLI_write("ttl=%d\r\n",conn->pcb.udp->ttl);
  if (err == ERR_OK) {
      while(1){
        struct pbuf *my_udp_pbuf;
        my_udp_pbuf = pbuf_alloc(PBUF_TRANSPORT,sizeof(my_udp_testbuf),PBUF_RAM);
        if(my_udp_pbuf)
        {
        pbuf_take(my_udp_pbuf,my_udp_testbuf,sizeof(my_udp_testbuf));
        CLI_write("payload's adress = %d\r\n",my_udp_pbuf->payload); 
        uint32_t* temp_ptr;
        temp_ptr=(uint32_t*)my_udp_pbuf->payload;
        uint8_t count = 0;
        while(count<(sizeof(my_udp_testbuf)/sizeof(uint32_t)))
        {
          CLI_write("%dth number = %d\r\n",count,*temp_ptr);
          count++;
          temp_ptr++;
        }
        CLI_write("count=%d\r\n",count);
        CLI_write("set up my udp pbuf\r\n");
        err = udp_sendto(conn->pcb.udp,my_udp_pbuf,conn->pcb.udp->remote_ip,conn->pcb.udp->remote_port);
        CLI_write("err=%d\r\n",err);
        CLI_write("send is finish\r\n");
          pbuf_free(my_udp_pbuf);
         }
       }
      }
  }

//have disable the DHCP and autoIP
static void
test_netif_init(void)
{
#if LWIP_IPV4 && USE_ETHERNET
  ip4_addr_t ipaddr, netmask, gw;
#endif /* LWIP_IPV4 && USE_ETHERNET */

#if USE_DHCP || USE_AUTOIP
  err_t err;
#endif


#if USE_ETHERNET
#if LWIP_IPV4
  ip4_addr_set_zero(&gw);
  ip4_addr_set_zero(&ipaddr);
  ip4_addr_set_zero(&netmask);
#if USE_ETHERNET_TCPIP
#if USE_DHCP
  DebugP_log("Starting lwIP, local interface IP is dhcp-enabled\r\n");
#elif USE_AUTOIP
  DebugP_log("Starting lwIP, local interface IP is autoip-enabled\r\n");
#else /* USE_DHCP */
  LWIP_PORT_INIT_GW(&gw);
  LWIP_PORT_INIT_IPADDR(&ipaddr);
  LWIP_PORT_INIT_NETMASK(&netmask);
  DebugP_log("Starting lwIP, local interface IP is %s\r\n", ip4addr_ntoa(&ipaddr));
#endif /* USE_DHCP */
#endif /* USE_ETHERNET_TCPIP */
#else /* LWIP_IPV4 */
  DebugP_log("Starting lwIP, IPv4 disable\r\n");
#endif /* LWIP_IPV4 */

#if LWIP_IPV4
  init_default_netif(&ipaddr, &netmask, &gw);
#else
  init_default_netif();
#endif
#if LWIP_IPV6
  netif_create_ip6_linklocal_address(netif_default, 1);
#if LWIP_IPV6_AUTOCONFIG
  netif_default->ip6_autoconfig_enabled = 1;
#endif
  DebugP_log("ip6 linklocal address: %s\r\n", ip6addr_ntoa(netif_ip6_addr(netif_default, 0)));
#endif /* LWIP_IPV6 */
#if LWIP_NETIF_STATUS_CALLBACK
  netif_set_status_callback(netif_default, status_callback);
#endif /* LWIP_NETIF_STATUS_CALLBACK */
#if LWIP_NETIF_LINK_CALLBACK
  netif_set_link_callback(netif_default, link_callback);
#endif /* LWIP_NETIF_LINK_CALLBACK */

#if USE_ETHERNET_TCPIP
#if LWIP_AUTOIP
  autoip_set_struct(netif_default, &netif_autoip);
#endif /* LWIP_AUTOIP */
#if LWIP_DHCP
  dhcp_set_struct(netif_default, &netif_dhcp);
#endif /* LWIP_DHCP */
  netif_set_up(netif_default);
#if USE_DHCP
err = dhcp_start(netif_default);
LWIP_ASSERT("dhcp_start failed", err == ERR_OK);
#elif USE_AUTOIP
err = autoip_start(netif_default);
LWIP_ASSERT("autoip_start failed", err == ERR_OK);
#endif /* USE_DHCP */
#else /* USE_ETHERNET_TCPIP */
  /* Use ethernet for PPPoE only */
  netif.flags &= ~(NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP); /* no ARP */
  netif.flags |= NETIF_FLAG_ETHERNET; /* but pure ethernet */
#endif /* USE_ETHERNET_TCPIP */
#endif /* USE_ETHERNET */

ip4_addr_t my_addr;
ip4_addr_t my_mask;
ip4_addr_t my_gw;
IP4_ADDR(&my_addr,172,168,4,207);
IP4_ADDR(&my_mask,255,255,254,0);
IP4_ADDR(&my_gw,172,168,4,1);
netif_set_down(netif_default);
netif_set_ipaddr(netif_default,&my_addr);
netif_set_netmask(netif_default,&my_mask);
netif_set_gw(netif_default,&my_gw);
netif_set_up(netif_default);
memcpy(&gMmwMssMCB.enetCfg.localIp, &my_addr, sizeof(ip4_addr_t));
CLI_write ("Local IP set is: %s\n", ip4addr_ntoa((const ip4_addr_t *)&gMmwMssMCB.enetCfg.localIp));
}

串口打印的信息

串口打印的信息
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-7-27 15:26:22 | 显示全部楼层
帮顶。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:15 , Processed in 0.160523 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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