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.

[参考译文] CCS/TM4C1294NCPDT:以太网客户端程序开发

Guru**** 2581345 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/749146/ccs-tm4c1294ncpdt-ethernet-client-program-development

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我使用的是 enet_weather 示例代码。 我不想使用该天气应用。 我想将此示例用作客户端、以作为服务器连接到我的 PC、并将一些数据发送到具有 "IP 地址"和"端口号"的 PC。 如何开始开发? 我已经看到了 tcp_echo 应用程序、但它与 RTOS 相关。 我将 EVK 板(192.168.0.102)连接 到路由器端口并尝试 ping。 它没有响应。

使用32字节数据 ping 192.168.0.102:
从192.168.0.105回复:无法访问目标主机。
从192.168.0.105回复:无法访问目标主机。
从192.168.0.105回复:无法访问目标主机。

我尝试了与套接字相关的编程、在 "lwipopts.h"文件中将 lwip_socket 设置为"1"。

此致、

Saiteja。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已将您的问题转交给我们的以太网专家。 然而,这是美国的一个重要节日。 他可能无法在星期一晚些时候作出答复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    下面的主题可能对您有所帮助。

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

    您好、Charles、

    感谢您的回复。 我对给定信息有了基本的了解。 在给定链接中、修改后的 enet_lwip 作为服务器工作。 我尝试根据 此信息 http://lwip.wikia.com/wiki/Raw/TCP 将其作为客户端进行修改。  

    void tcp_setup (void)

    uint32_t data = 0xdeadf牛肉;

    /*创建 IP */
    struct ip_addr ip;

    IP4_ADDR (&IP、192、168、0、106);//服务器 IP  

    /*创建控制块*/
    testpcb = tcp_new();//testpcb 是一个全局结构 tcp_pcb

    tcp_bind (testpcb、&IP、8999);

    tcp_arg (testpcb、&data);

    tcp_err (testpcb、echo_error);
    tcp_recv (testpcb、tcpRecvCallback);
    tcp_sent (testpcb、echo_sent);

    /*现在连接*/
    tcp_connect (testpcb、&IP、8999、connectCallback);

    您能不能建议我还需要什么来作为客户来发送数据?

    此致、

    Saiteja。

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

    您好!

     下面只是一个示例。 客户端向服务器发送"Hello World"。

    uint32_t tcp_send_packet (void)
    {
    char *字符串="Hello World! \n\n";
    
    ERR = tcp_write (testpcb、string、strlen (string)、tcp_write_flag_copy);
    
    
    如果(err){
    UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_write)\n"、错误);
    返回1;
    }
    
    /*现在发送*/
    ERR = tcp_output (testpcb);
    如果(err){
    UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_output)\n"、错误);
    返回1;
    }
    返回0;
    }
    
    ERR_t connectCallback (void *arg、struct tcp_pcb、err_t err)
    {
    
    
    if (err =ERR_OK){
    
    UARTprintf ("连接已建立。\n");
    
    
    tcp_recv (testpcb、eco_receive);
    tcp_sent (testpcb、NULL);
    UARTprintf ("向服务器发送问候消息\n");
    tcp_send_packet();
    返回0;
    } 否则{
    UARTprintf ("未建立连接。\n");
    返回1;
    
    }
    }
    
    void echo_client_init (void)
    {
    /*创建 IP */
    struct ip_addr server_addr;
    
    
    /*创建控制块*/
    testpcb = tcp_new();//testpcb 是一个全局结构 tcp_pcb
    
    if (testpcb!=空)
    {
    IP4_ADDR (&server_addr、10、219、15、38);PC 计算机 TCP/IP
    
    tcp_bind (testpcb、IP_ADDR_ANY、7000);
    
    //现在连接*/
    err = tcp_connect (testpcb、&server_addr、8000、connectCallback);
    如果(err){
    UARTprintf ("错误:代码:%d (tcp_connect)\n"、错误);
    }
    
    UARTprintf ("PCB created \n");
    
    } 否则{
    memp_free (MEMP_tcp_PCB、testpcb);
    UARTprintf ("PCB 未创建\n");
    
    }
    
    } 

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

    您好、Charles、

    我尝试了给定的更改。 但是,客户端不会向服务器发送任何数据,甚至没有建立连接。 我已提供服务器 IP 地址(IP4_ADDR (&server_addr、192、168、0、105)、其端口号为8004、它在另一台 PC 上运行。 使用绑定 调用时不进行任何更改。 它正在执行 ping 操作,但未连接到服务器。  我添加了 ECHO_INIT 注释并简单地调用 client_init。 我将断点放置在未到达该断点的 connectCallback 函数中。

    您能汇总评论行中哪个端口属于哪个设备吗? 我在 使用 usrtcp 应用程序时尝试了相同的问题。 我想知道您是如何测试客户端程序的。 也在 main 中

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    服务器 IP 地址(IP4_ADDR (&server_addr、192、168、0、106))
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    什么是 ECHO_INIT、什么是 CLIENT_INIT? 这是您自己的代码吗? 我显示的代码改为 ECHO_CLIENT_INIT()。 如果您查看回显_client_init 中的以下两行、则端口7000是客户端的本地端口、而8000是服务器端口号。 请使用 Wireshark 捕获以太网流量进行诊断。

    tcp_bind (testpcb、ip_ADDR_any、7000);
    ERR = tcp_connect (testpcb、&server_addr、8000、connectCallback);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    它现在正在工作、TM4C (客户端)和其他 PC 中的服务器之间建立了连接并发送消息。 当我在  lwIPHostTimerHandler()函数中放置 echo 客户机_init()函数调用时,该函数就能正常工作。 连续消息不会发送我尝试使用 tcp_keepalive()的消息。 我将其作为服务器的同一代码,在 lwIPHostTimerHandler()函数中没有包含服务器初始化函数,它运行正常。 我是否可以知道发生这种情况的原因?  

     lwIPHostTimerHandler()中代码片段的一部分。
    //显示新的 IP 地址。
    //
    UARTprintf ("IP 地址:");
    DisplayIPAddress (ui32NewIPAddress);
    UARTprintf ("\n 打开浏览器并输入 IP 地址。\n");
    ECHO_CLIENT_INIT();
    //

    现在、我要将此 TCP 客户端作为 HTTP 客户端。 我在中看到了 enet_weather 示例、即他们使用 的是应用 程序 API 、而 enet_lwip 也是 HTTP 服务器。  我想将简单消息发送到 HTTP 服务器、并从服务器打印响应。 建议我最好的方法。

    此致、

    B S Sai Prasad  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您需要等待从 DHCP 服务器获取 IP 地址、然后才能调用 ECHO_CLIENT_INIT、这是正确的。 原因是、如果在获取 IP 地址之前调用 ECHO_CLIENT_INIT、客户端将向服务器发送同步段、但源地址等于0.0.0.0。 如果源地址为0.0.0.0,服务器将不会确认请求。

    请查看以下链接、该链接可能有助于回答您提出 HTTP 客户端请求的问题。
    stackoverflow.com/.../how-can-i-send-a-simple-http-request-with-a-lwip-stack
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢您的回复。 现在、我想连续发送数据、但在一次传输后它正在中止。 我在 while 循环中使用此代码来连续传输和接收数据。

    while (1)

     tcp_write (testpcb、string、strlen (string)、tcp_write_flag_copy);

     tcp_recv (testpcb、eco_recv);

    delay();

    一次传输后,它将到达 exit.c 文件中的 abort()。 为了实现连续传输、我需要执行哪些更改。

    此致、

    B S Sai Prasad。

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

    您好!

     您的 echo_recv()回调在哪里? 下面是一个示例。

      

    char MyData[1024];
    
    err_t echo_receive (void * arg、struct tcp_pcb、struct pbuf * p、err_t err)
    {
    int len;
    char *header="客户机:";
    int header_len = strlen (标头);
    
    UARTprintf ("接收到的数据。\n");
    if (p = NULL){
    UARTprintf ("远程主机关闭了连接。\n");
    tcp_close (tpcb);
    返回 ERR_ABRT;
    } 否则{
    tcp_recved (tpcb、p->t_t_len);
    
    //支付负荷的大小
    len = p->t_t_len + header_len;
    
    strcpy (MyData、标头);
    strcat (MyData、(char *) p->payload);
    
    
    //释放数据包缓冲区
    pbuf_free (p);
    
    //检查输出缓冲器容量
    如果(len > tcp_sndbuf (tpcb))
    len= tcp_sndbuf (tpcb);
    
    //将数据排队发送出去
    ERR = tcp_write (tpcb、MyData、len、0);
    如果(err =ERR_OK){
    UARTprintf ("回送数据");
    }
    否则、如果(err =ERR_MEM)
    {
    //内存不足,请稍后再试,推迟轮询*/
    UARTprintf ("内存不足。\n");
    
    } 其他
    {
    /*需要注意的其他问题*/
    UARTprintf ("其他问题。\n");
    }
    tcp_sent (tpcb、NULL);//无需回拨*/
    }
    
    
    返回 ERR_OK;
    }