This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM2634:UDP 客户端实施

Guru**** 1791630 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1396085/am2634-udp-client-implementation

器件型号:AM2634

工具与软件:

我的团队、

我正在 评估板上的 UDP 客户端实施 、所以 我正在进行编辑  enet_cpsw_rawhttpserver_am263x-cc_r5fss0-0_nortos_ti-arm-clang  项目。

这里我遇到了一个问题,当 evl 板(UDP 客户端)发送数据到服务器(计算机)成功交付,但每当服务器发送数据到客户端,它不交付给客户端( EVL 板).

e2e.ti.com/.../7382.enet_5F00_cpsw_5F00_rawhttpserver_5F00_am263x_2D00_cc_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

请找出测试建议,并请告诉我这个问题。 您的反馈会更加满意  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aakash V:

    请您确认以下信息。 不确定我现在是否具有带宽来浏览整个代码。

    1.您能否在 CCS Expressions 窗口中选中 lwip_stats (输入"lwip_stats")。 不要从 MCU 向 PC 发送任何数据、只能从 PC 向 MCU 发送数据(您提到的情况会失败)。 在 LwIP 统计信息中、检查是否存在与内存相关的错误或 UDP 错误。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:

    我在表达式中使用 lwip_stats 进行了测试、但无法获得该值。







    您能检查一下我上面提到的工程的 zip 文件吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aakash V:  

    1.你需要暂停你的核心,然后检查统计数据。

    2.只是一个请求,下一次你发送一个已被修改的应用程序时,如果你分享一些关于修改的信息,你/Lotus-Wireless 所做的代码添加将是很好的。 很难仅凭一个"zip"的项目来调试已实现的项目、而无需任何相关的代码演示、也不了解具体的测试背景信息。 在 TI、我完全不知道您正在做什么。 我还建议清理您的代码(删除 httpd_init 的 API 调用和 http 服务器的文件(只要我知道您不使用 HTTP 服务器、但会消耗 lwip pbufs 和内存)。

    3.您需要给我一些关于如何测试您修改的应用程序的输入,我在连接到端口1的 Linux PC 上运行 NCAT 服务器,我看不到任何数据从客户端进入服务器。 我看到您启用了2个 MAC 端口。 哪个 MAC 端口与 UDP 服务器通信? 我看到服务器的 IP 已硬编码为"192.168.2.2"、但 MAC 端口-1的网络可以动态获取 IP 地址? 您能发送更多信息吗?  

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:


    1.我做过的修改是注释现有的 http_server 应用程序(. 添加 UDP INIT、UDP 发送 UDP 接收) 功能只有其余的东西是一样的,我删除了这个 futions HTTP 服务器功能, 按照您的建议。

    #include "lwip/pbuf.h"
    #include "lwip/udp.h"
    #include "lwip/tcp.h"
    
    #include "stdio.h"
    #include "string.h"
    
    
    void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
    static void udpClient_send(void);
    
    struct udp_pcb *upcb;
    char buffer[100];
    int counter = 0;
    
    /* IMPLEMENTATION FOR UDP CLIENT :   source:www.geeksforgeeks.org/.../
    
    1. Create UDP socket.
    2. Send message to server.
    3. Wait until response from server is received.
    4. Process reply and go back to step 2, if necessary.
    5. Close socket descriptor and exit.
    */
    
    
    void udpClient_connect(void)
    {
        err_t err;
    
        /* 1. Create a new UDP control block  */
        upcb = udp_new();
    
        /* Bind the block to module's IP and port */
        ip_addr_t myIPaddr;
        IP_ADDR4(&myIPaddr, 192, 168, 2, 200);
        udp_bind(upcb, &myIPaddr, 8);
    
    
        /* configure destination IP address and port */
        ip_addr_t DestIPaddr;
        IP_ADDR4(&DestIPaddr, 192, 168, 2, 2);
        err= udp_connect(upcb, &DestIPaddr, 7);
    
        if (err == ERR_OK)
        {
            /* 2. Send message to server */
            udpClient_send ();
    
            /* 3. Set a receive callback for the upcb */
            udp_recv(upcb, udp_receive_callback, NULL);
        }
    }
    
    static void udpClient_send(void)
    {
      struct pbuf *txBuf;
      char data[100];
    
      int len = sprintf(data, "sending UDP client message %d", counter);
    
      /* allocate pbuf from pool*/
      txBuf = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);
    
      if (txBuf != NULL)
      {
        /* copy data to pbuf */
        pbuf_take(txBuf, data, len);
    
        /* send udp data */
        udp_send(upcb, txBuf);
    
        /* free pbuf */
        pbuf_free(txBuf);
      }
    }
    
    
    void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
    {
        /* Copy the data from the pbuf */
        strncpy (buffer, (char *)p->payload, p->len);
    
        /*increment message count */
        counter++;
    
        /* Free receive pbuf */
        pbuf_free(p);
    }
    

    我的要求实现: 当这个行 udp_recv ()这应该调用这个 UDP_receive_callback()函数时,曾经发送"hello"或任何数据,但不触发。 所以请解释这个原因。

    3. Hercules/sockettest 软件在 Windows 平台上使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Aakash:

    这似乎是您最终遇到的实施问题、与 TI 集成 LwIP 无关。 您可以尝试在实际的 LwIP 论坛或 LwIP 邮件列表中询问此 LwIP 特定问题。 前面讲过、TI 并不拥有 LwIP、它仅拥有 MCU_PLUS_SDK 中 LwIP 的集成和移植。

    我们已在 source/networking/lwip/lwip-stack/udpc/core 和 source/networking/lwip/lwip-stack/pri  src apps/udpecho_raw 文件夹中提供了 src 示例作为 LwIP 堆栈的一部分。 您可以尝试参考它们。

    UdpClientSend()函数是否是阻塞调用? 您是否可以尝试注释 UDP 发送功能、然后尝试使用 udp_recv 接收数据、并确认当禁用发送且仅启用 UDP 接收时、您仍然无法接收数据?

    直到我看到 TI 软件出现问题、我才会优先考虑并为此投入高带宽。 不幸的是、这与您的实现有关。 TI 在 SDK 中确实有一个 UDP 示例、它可以向服务器发送数据或从服务器接收数据。

    此致、
    Shaunak

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shaunak:

    感谢您的早期重播、

    I s UdpClientSend()函数阻塞调用? 您是否可以尝试注释 UDP 发送功能、然后尝试使用 udp_recv 接收数据、并确认当禁用发送且仅启用 UDP 接收时、您仍然无法接收数据?

    是的、我评论了 这个  UdpClientSend() SO udp_recv()   工作正常。 所以,如果你知道,有什么其他的逻辑说。 因为我只需要在该项目中编辑。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aakash、到目前为止、我的理解是:

    UDP 客户端-> UDP 服务器正在工作

    UDP 服务器-> UDP 客户端正在工作。

    它们仅在同时调用时不起作用、因为某个器件阻止了 udp_send 函数。 如前所述、由于问题不在 TI 驱动程序或堆栈中、因此我不能在此处花太多时间、因为这在您的最终应用(并非 TI 拥有)中是错误的。 当 TI 的产品没有任何问题时、我无法使用我的带宽来调试您的应用。 我只提供了几个调试提示:

    1.检查 UdpClientSend()函数逻辑并检查为什么不调用 udp_recv、什么是阻止发送过程? 数据包是否未由 LwIP 传输到以太网驱动程序? 由于 send 函数处于阻塞状态、您的接收回调尚未注册。

    2.如果您希望同时发送和接收,您将不得不重新评估您的逻辑,因为该线性代码将执行下一个步骤(接收),直到完成前一个(发送),代码从 UdpClientSend()返回。

    3.继续停止您的核心并继续检查 lwip_stats 以查看是否存在与您预期的场景不匹配的情况。

    此致、
    Shaunak Deshpande.