lzq 发表于 2022-7-27 11:32:39

UDP通信错误

最近在使用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指向的地址中通过串口打印
请各位帮忙看一下,哪里出了问题,谢谢

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;
my_udp_testbuf=0;
my_udp_testbuf=1;
my_udp_testbuf=2;
my_udp_testbuf=3;
my_udp_testbuf=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));
}

eric2013 发表于 2022-7-27 15:26:22

帮顶。
页: [1]
查看完整版本: UDP通信错误