查看: 7252|回复: 29

[已解决] LPC54608 UDP发送,上位机收不到数据

[复制链接]

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
发表于 2017-9-29 09:03:02 | 显示全部楼层 |阅读模式
大家好。最近在看SDK_2.2_LPC54608J512\boards\lpcxpresso54608\demo_apps\lwip\lwip_udpecho,这个demo功能是收到上位机的发出来的数据,然后收到后,发送回去,demo功能正常。但是我自己写一个函数,只发送到上位机,但是网络助手收不到数据。我是在lwip_udpecho这个基础上修改了main函数,如下:void main()
{
    struct netif fsl_netif0;
    ip4_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw;
    CLOCK_EnableClock(kCLOCK_InputMux);
    /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
    BOARD_InitPins();
    BOARD_BootClockFROHF48M();
    BOARD_InitDebugConsole();
    time_init();
    IP4_ADDR(&fsl_netif0_ipaddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3);
    IP4_ADDR(&fsl_netif0_netmask, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3);
    IP4_ADDR(&fsl_netif0_gw, configGW_ADDR0, configGW_ADDR1, configGW_ADDR2, configGW_ADDR3);
    lwip_init();
    netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, NULL, ethernetif_init, ethernet_input);
    netif_set_default(&fsl_netif0);
    netif_set_up(&fsl_netif0);
     upcb=udpecho_raw_init();
//上面部分代码是demo里的,以下是自己添加的
    struct pbuf *q = NULL;  
   const uint8_t UDPArr[6] = {"Hello!"};
   struct udp_pcb *upcb;   
   err_t   stus;
   q = pbuf_alloc(PBUF_TRANSPORT, sizeof(UDPArr), PBUF_RAM);
   q->payload=(void*)(UDPArr);
   upcb = udp_new();  
   udp_bind(upcb, IP_ADDR_ANY,7);  
   stus=udp_sendto(upcb, q,&fsl_netif0_gw,7);
         if(stus == ERR_OK)
         {
                 PRINTF("OK!\n");
         }
         udp_disconnect(upcb);
         pbuf_free(q);


}

最佳答案

paulkiyt 发表于 2017-12-19 16:05 是不是换个端口就OK了呢? 基于网络进行的通信的两个进程会使用客户机-服务器模型,即两个进程中一个称为客户机进程,另一个称为服务器进程,服务器进程必须绑定到一个熟知的端口 ...
回复

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2017-9-29 09:15:33 | 显示全部楼层
上面有一句有误,粘贴错了
upcb=udpecho_raw_init();
应该是:
udpecho_raw_init();
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20124
最后登录
2024-5-3
发表于 2017-9-29 09:49:04 | 显示全部楼层
通过Wireshare抓到的数据是什么样的呢?
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2017-9-29 11:42:57 | 显示全部楼层
小恩GG 发表于 2017-9-29 09:49
通过Wireshare抓到的数据是什么样的呢?

网络助手和网络抓包工具都没有数据

QQ截图20170929113957.png
QQ截图20170929114123.png
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2017-9-29 14:59:02 | 显示全部楼层
小恩GG 发表于 2017-9-29 09:49
通过Wireshare抓到的数据是什么样的呢?

你好。刚调试了一下,结果是这样的:必须在demo的while里添加这个函数 ethernetif_input(&fsl_netif0);
这个函数会调用这个函数 if (netif->input(p, netif) != ERR_OK),最终是udpecho_raw.c里面的下面这个udpecho_raw_recv函数:
其功能就是将受到的数据,反发送出去,我将其发送注释掉。然后自己添加的发送hello就可以实现了,但是没想通,为什么必须要ethernetif_input(&fsl_netif0)这个函数,而且必须放在while里,这个不是接收的函数吗 跟我发送存在什么关系呢??
static void udpecho_raw_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
                 const ip_addr_t *addr, u16_t port)
{
//  LWIP_UNUSED_ARG(arg);
//  if (p != NULL) {
//    /* send received packet back to sender */
//    udp_sendto(upcb, p, addr, port);
//    /* free the pbuf */
//    pbuf_free(p);
//  }
}

以下是结果
QQ截图.png
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20124
最后登录
2024-5-3
发表于 2017-9-29 17:15:17 | 显示全部楼层
楼主能否将完整自己修改的代码贴出来,这样我好复现一下你那边的现象
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2017-9-29 18:10:08 | 显示全部楼层
小恩GG 发表于 2017-9-29 17:15
楼主能否将完整自己修改的代码贴出来,这样我好复现一下你那边的现象

这是修改的例程

lwip_udpecho_new.rar

18.3 MB, 下载次数: 17, 下载积分: 威望 1

回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2017-10-9 10:13:03 | 显示全部楼层
有大神知道是什么原因吗?
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20124
最后登录
2024-5-3
发表于 2017-10-9 15:22:38 | 显示全部楼层

前段时间国庆放假没看到,编译有很多错误,你只需要告诉我具体改动的地方,罗列出来,我在自己这边测试就行
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2017-10-9 16:17:50 | 显示全部楼层
小恩GG 发表于 2017-10-9 15:22
前段时间国庆放假没看到,编译有很多错误,你只需要告诉我具体改动的地方,罗列出来,我在自己这边测试就 ...

基于SDK_2.2_LPC54608J512\boards\lpcxpresso54608\demo_apps\lwip\lwip_udpecho这个例子修改
1.main函数修改如下:红色为修改部分
int main(void)
{
    struct netif fsl_netif0;
    ip4_addr_t fsl_netif0_ipaddr, fsl_netif0_netmask, fsl_netif0_gw;

    CLOCK_EnableClock(kCLOCK_InputMux);

    /* attach 12 MHz clock to FLEXCOMM0 (debug console) */
    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

    BOARD_InitPins();
    BOARD_BootClockFROHF48M();
    BOARD_InitDebugConsole();

    time_init();

    IP4_ADDR(&fsl_netif0_ipaddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3);
    IP4_ADDR(&fsl_netif0_netmask, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3);
    IP4_ADDR(&fsl_netif0_gw, configGW_ADDR0, configGW_ADDR1, configGW_ADDR2, configGW_ADDR3);

    lwip_init();

    netif_add(&fsl_netif0, &fsl_netif0_ipaddr, &fsl_netif0_netmask, &fsl_netif0_gw, NULL, ethernetif_init,ethernet_input);
    netif_set_default(&fsl_netif0);
    netif_set_up(&fsl_netif0);

    udpecho_raw_init();

    PRINTF("\r\n************************************************\r\n");
    PRINTF(" UDP Echo example\r\n");
    PRINTF("************************************************\r\n");
    PRINTF(" IPv4 Address     : %u.%u.%u.%u\r\n", ((u8_t *)&fsl_netif0_ipaddr)[0], ((u8_t *)&fsl_netif0_ipaddr)[1],
           ((u8_t *)&fsl_netif0_ipaddr)[2], ((u8_t *)&fsl_netif0_ipaddr)[3]);
    PRINTF(" IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&fsl_netif0_netmask)[0], ((u8_t *)&fsl_netif0_netmask)[1],
           ((u8_t *)&fsl_netif0_netmask)[2], ((u8_t *)&fsl_netif0_netmask)[3]);
    PRINTF(" IPv4 Gateway     : %u.%u.%u.%u\r\n", ((u8_t *)&fsl_netif0_gw)[0], ((u8_t *)&fsl_netif0_gw)[1],
           ((u8_t *)&fsl_netif0_gw)[2], ((u8_t *)&fsl_netif0_gw)[3]);
    PRINTF("************************************************\r\n");

  struct pbuf *q = NULL;  
   const char* senddata = "Hello\n";  
   struct udp_pcb *upcb;  
   err_t  stus;
   upcb = udp_new();  
   udp_bind(upcb, IP_ADDR_ANY, 7);  
   q = pbuf_alloc(PBUF_TRANSPORT, strlen(senddata)+1, PBUF_ROM);  
   if(!q)  
   {  
    PRINTF("out of PBUF_RAM\n");  
   }  
         q->payload = (void *)senddata;
    while (1)
    {
        /* Poll the driver, get any outstanding frames */
        stus=udp_sendto(upcb, q, &fsl_netif0_gw, 7);
         if(stus ==ERR_OK)
         {
                 PRINTF("ERR_OK!\n");
         }
   ethernetif_input(&fsl_netif0);

   sys_check_timeouts(); /* Handle all system timeouts for all core protocols */
    }
}



2.将udpecho_raw.c中的udpecho_raw_recv函数修改如下:红色部分为修改
static void
udpecho_raw_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p,
                 const ip_addr_t *addr, u16_t port)
{
//  LWIP_UNUSED_ARG(arg);
//  if (p != NULL) {
//    /* send received packet back to sender */
//    udp_sendto(upcb, p, addr, port);
//    /* free the pbuf */
//    pbuf_free(p);
//  }
}


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-5-4 11:08 , Processed in 0.164119 second(s), 32 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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