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**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/727914/ccs-tm4c1294ncpdt-sendind-data-via-ethernet-example

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

你(们)好

我正在寻找一个在 Tiva C 微控制器中使用 LWIP 堆栈的示例、我浏览了工作簿示例 enet_lwip、 但我不知道如何修改它、我能够从 ADC 读取一些数据、我想通过以太网发送它。  

如果有人为我提供了一个起点或一个指南、我可以按照该指南在 Code Composer 中实施 lwip 堆栈、我只想了解如何通过 TCP 发送数据包

提前感谢

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

    您好!

     enet_lwip 是一个 HTTP 应用示例。 我认为您需要从 TCP 回波示例开始。 有关回波示例和其他 LwIP API 用户指南、请参阅以下链接。

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

    尊敬的 Charles、感谢您的回答

    按照您分享的链接中的说明、我尝试修改 enet_lwip、但我没有成功、我可以 ping 到板、但看不到正在发送数据包(我尝试在 PuTTy 和浏览器中打开原始连接)、 我使用 UART 消息来了解正在发生的情况、似乎无法进入"connectedCallback"并发送数据包。

    这是我的代码、如果你能给它一个外观就好了

    #include 
    #include 
    #include 
    #include 
    include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/flash.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/gpio.h"
    #include "drivers/rtc
    out_util.h"
    
    
    
    
    
    #include "drivers/truni.pnech #include "out_out_trintrune.h"#include "tctruni_utils/tude/tpintrinh #include "out_utils/tex"#include "out_trintrintrun.ld/tudes.h"#include "out_utils/tpinh #include "out.ld/truni_utils"#include "#tex"#tpintrintrintrintrintru.h"
    
    
    
    
    
    
    
    
    
    
    
    
    ERR_t ECHO_POLL (void *arg、struct tcp_pcb);
    void ECHO_ERROR (void *arg、ERR_t err);
    err_t ECHO_SENT (void *arg、 struct tcp_pcb * tpcb、u16_t len);
    err_t err;
    
    uint32_t tcp_send_packet (void);
    
    static struct tcp_pcb * testpcb;//pcb 全局
    
    
    #define SYSTICKHZ 100
    #define SYSTICKMS (1000/SYSTICKHZ)
    
    #define SysTK_INT_PRIORITY 0x80
    #define ETHERNET_INT_PRIORITY 0xC0
    
    uINT32_t g_ui32IPAddress;
    
    uINT32_t g_ui32SysClock;
    volatile bg_bled;
    
    
    
    //*********
    //驱动程序库遇到错误时调用的错误例程。
    //
    #ifdef debug
    void
    __error__(char *pcFilename、uint32_t ui32Line)
    {
    
    #endif
    
    
    void
    DisplayIPAddress (uint32_t ui32Addr)
    {
    char pcBuf[16];
    //将 IP 地址转换为字符串。
    usprintf (pcBuf、"%d.%d.%d.%d"、ui32Addr & 0xff、(ui32Addr >> 8)& 0xff、
    (ui32Addr >> 16)& 0xff、(ui32Addr >> 24)& 0xff);
    UARTprintf (pcBuf);
    }
    
    //*************
    // lwIP 库支持任何与主机相关的计时器函数所需的。
    //
    void
    lwIPHostTimerHandler (void)
    {
    uint32_t ui32NewIPAddress;
    
    ui32NewIPAddress = lwIPLocalIPAddrGet ();//获取当前 IP 地址。
    
    if (ui32NewIPAddress!= g_ui32IPAddress)//查看 IP 地址是否已更改。
    {
    if (ui32NewIPAddress == 0xffffffff)
    {
    UARTprintf ("正在等待链接。\n");
    }
    否则、如果(ui32NewIPAddress =0)
    {
    UARTprintf ("正在等待 IP 地址。\n");
    }
    其他
    {
    UARTprintf ("IP 地址:");
    DisplayIPAddress (ui32NewIPAddress);
    UARTprintf ("\n 打开浏览器并输入 IP 地址。\n");
    }
    G_ui32IPAddress = ui32NewIPAddress;
    }
    
    if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff))
    {
    //
    //不执行任何操作并继续等待。
    //
    }
    }
    
    //*********
    // SysTick 中断的中断处理程序。
    //
    void
    SysTickIntHandler (void)
    {
    lwIPTimer (SYSTICKMS);
    
    G_bled = true;
    }
    
    
    //*********
    
    ERR_t tcpRecvCallback (void *arg、struct tcp_pcb、struct pbuf *p、err_t err)
    {
    UARTprintf ("接收到的数据。\n");
    if (p = NULL){
    UARTprintf ("远程主机关闭了连接。\n");
    UARTprintf ("正在关闭连接。\n");
    tcp_close (testpcb);
    返回 ERR_ABRT;
    } 否则{
    UARTprintf (" pbufs %d\n"、pbuf_clen (p)的数量);
    UARTprintf (" pbuf %s\n"的内容、(char *) p->payload);
    }
    
    返回0;
    }
    
    uint32_t tcp_send_packet (void)
    {
    char *字符串="head /process.php?data1=12&data2=5 HTTP/1.0\r\n 主机:mywebsite.com\r\n\r\n ";
    uint32_t len = strlen (string);
    
    
    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)
    {
    UARTprintf ("连接已建立。\n");
    UARTprintf ("发送数据包\n");
    tcp_send_packet();
    返回0;
    }
    
    void tcp_setup (void)
    {
    uint32_t data = 0xdeadf牛肉;
    
    /*创建 IP */
    struct ip_addr ip;
    
    IP4_ADDR (&IP、192、168、0、4);计算机的/IP
    
    /*创建控制块*/
    testpcb = tcp_new();//testpcb 是一个全局结构 tcp_pcb
    
    
    
    tcp_arg (testpcb、&data);
    
    tcp_err (testpcb、echo_error);
    tcp_recv (testpcb、tcpRecvCallback);
    tcp_sent (testpcb、echo_sent);
    
    /*现在连接*/
    tcp_connect (testpcb、&IP、80、connectCallback);
    UARTprintf ("PCB created n");
    
    }
    
    
    
    
    int
    main (void)
    {
    uint32_t ui32User0、ui32User1;
    uint8_t pui8MACArray[8];
    
    
    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);
    
    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    PinoutSet (true、false);
    
    UARTStdioConfig (0、115200、g_ui32SysClock);
    
    
    UARTprintf ("\033[2J\033[H");
    UARTprintf ("以太网 lwIP 示例\n\n");
    
    MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
    
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1);
    
    MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ);
    map_SysTickEnable();
    map_SysTickIntEnable();
    
    map_FlashUserGet (&ui32User0、&ui32User1);
    if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)
    {
    UARTprintf ("未对 MAC 进行编程!\n");
    while (1)
    {
    }
    }
    
    UARTprintf ("正在等待 IP.\n");
    
    pui8MACArray[0]=((ui32User0 >> 0)& 0xff);
    pui8MACArray[1]=((ui32User0 >> 8)& 0xff);
    pui8MACArray[2]=((ui32User0 >> 16)& 0xff);
    pui8MACArray[3]=((ui32User1 >> 0)& 0xff);
    pui8MACArray[4]=((ui32User1 >> 8)& 0xff);
    pui8MACArray[5]=((ui32User1 >> 16)& 0xff);
    
    lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);
    
    //
    //设置设备定位服务。
    //
    LocatorInit();
    LocatorMACAddrSet (pui8MACArray);
    LocatorAppTitleSet ("EK-TM4C1294XL enet_IO");
    
    
    //初始化示例 httpd 服务器。
    //
    // httpd_init();
    
    echo_init();
    
    tcp_setup();
    
    
    MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
    MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
    
    //
    //循环永久、处理 LED 闪烁。 所有工作都在中完成
    //中断处理程序。
    //
    while (1)
    {
    
    while (g_bled == false)
    {
    }
    
    //
    //清除标志。
    //
    G_bled = false;
    
    //
    //切换 LED。
    //
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、
    (MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^
    GPIO_PIN_1);
    }
    }
    

    我还在第三方文件夹中添加了来自 LWIP 的 TCP 应用程序  

    我将电路板连接到路由器、COM 端口会发送此消息  

    在我的计算机中、我只获得拒绝连接

    我怀疑我缺少一些明显的东西、如果有任何帮助、我将不胜感激  

    最好

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否先让 TCP 回波工作? 我看不到您在 tcp_setup 中使用 tcp_bind ()将 PCB 绑定到 IP 地址和端口。 我建议您首先使用回波示例。

    下面是指向 TCP 回显示例的另一个链接。
    coherentmusings.wordpress.com/.../
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Charles,您的要求绝对苛刻,我添加了 tcp_bind ()函数,现在正在工作。 非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rocamadour、
    您是否介意共享 tcpecho_raw/echo.h 文件、以便社区能够参考您的成功。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、这里是我使用的文件。 此致

    e2e.ti.com/.../tcpecho_5F00_raw.rar

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