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.

[参考译文] TM4C1294NCPDT:TM4C1294NCPDT-lwIP:TCP

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/782764/tm4c1294ncpdt-tm4c1294ncpdt-lwip-tcp

器件型号:TM4C1294NCPDT

大家好、

我已经检查了周围情况、但除了 enet_io、enet_lwip 等、找不到更复杂和描述性的示例 我正在尝试读回 RJ45并与主机(或其他器件)通信、是否有任何其他示例。 我想看 一下 tcp_recv (PCB、SocketReceive)、tcp_accepted (PCB)等的示例?

谢谢。

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

    您好!

     下面是服务器上 TCP 回显的一个简单示例。 您可以找到类似的示例@ 

    #include 
    #include 
    include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/flash.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/rom_map.h"
    
    #include "driverlib/sysctl.h"
    
    #include "drivers/util.h
    
    
    
    
    
    
    
    
    
    
    //
    //定义设置系统时钟。
    ////
    *****************
    #define SYSTICKHZ 100
    #define SYSTICKMS (1000 / SYSTICKHZ)
    
    //*********
    //
    //中断优先级定义。 这些值的前3位是
    //有效的、较低的值表示较高优先级的中断。
    ////
    *****************
    #define SysTK_INT_PRIORITY 0x80
    #define ETHERNET_INT_PRIORITY 0xC0
    
    //*********
    //
    //当前 IP 地址。
    ////
    *****************
    uint32_t g_ui32IPAddress;
    
    //*********
    //
    //系统时钟频率。
    ////
    *****************
    uint32_t g_ui32SysClock;
    
    //*********
    //
    //用于管理 LED 闪烁的易失性全局标志,因为它用于中断
    //和主应用程序。 LED 以 SYSTICKHZ 的速率闪烁。
    ////
    *****************
    volatile bool g_bled;
    
    
    void echo_init (void);
    
    //*********************
    //
    //显示 lwIP 类型的 IP 地址。
    ////
    *****************
    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;
    
    //
    //获取当前 IP 地址。
    //
    ui32NewIPAddress = lwIPLocalIPAddrGet ();
    
    //
    //查看 IP 地址是否已更改。
    //
    if (ui32NewIPAddress!= g_ui32IPAddress)
    {
    //
    //查看是否分配了 IP 地址。
    //
    if (ui32NewIPAddress == 0xffffffff)
    {
    //
    //表示没有链接。
    //
    UARTprintf ("正在等待链接。\n");
    }
    否则、如果(ui32NewIPAddress =0)
    {
    //
    //没有 IP 地址,因此请指明 DHCP 进程是什么
    //正在运行。
    //
    UARTprintf ("正在等待 IP 地址。\n");
    }
    其他
    {
    //
    //显示新的 IP 地址。
    //
    UARTprintf ("IP 地址:");
    DisplayIPAddress (ui32NewIPAddress);
    UARTprintf ("\n 回显服务器已就绪。\n");
    }
    
    //
    //保存新的 IP 地址。
    //
    G_ui32IPAddress = ui32NewIPAddress;
    }
    
    //
    //如果没有 IP 地址。
    //
    if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff))
    {
    //
    //不执行任何操作并继续等待。
    //
    }
    }
    
    //*********
    //
    // SysTick 中断的中断处理程序。
    ////
    *****************
    void
    SysTickIntHandler (void)
    {
    //
    //调用 lwIP 计时器处理程序。
    //
    lwIPTimer (SYSTICKMS);
    
    //
    //告诉应用程序更改 LED 的状态(换句话说
    //闪烁)。
    //
    G_bled = true;
    }
    
    //*********
    //
    //此示例演示了以太网控制器的使用。
    ////
    *****************
    int
    main (void)
    {
    uint32_t ui32User0、ui32User1;
    uint8_t pui8MACArray[8];
    
    //
    //确保主振荡器已启用,因为这是所要求的
    // PHY。 系统必须将一个25MHz 晶体连接到 OSC
    //引脚。 晶体时使用 SYSCTL_MOSC_HIGHFREQ 参数
    //频率为10MHz 或更高。
    //
    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);
    
    //
    //从 PLL 以120MHz 运行。
    //
    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    
    //
    //配置器件引脚。
    //
    PinoutSet (true、false);
    
    //
    //配置 UART。
    //
    UARTStdioConfig (0、115200、g_ui32SysClock);
    
    //
    //清除终端并打印横幅。
    //
    UARTprintf ("\033[2J\033[H");
    UARTprintf ("以太网 lwIP TCP 回显示例\n");
    
    //
    //将的端口 N1配置为动画 LED 的输出。
    //
    MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
    
    //
    //将 LED 初始化为关闭(0)
    //
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1);
    
    //
    //为周期性中断配置 SysTick。
    //
    MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ);
    map_SysTickEnable();
    map_SysTickIntEnable();
    
    //
    //为的以太网控制器过滤配置硬件 MAC 地址
    //传入数据包。 MAC 地址将存储在非易失性存储器中
    // USER0和 User1寄存器。
    //
    map_FlashUserGet (&ui32User0、&ui32User1);
    if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)
    {
    //
    //我们永远不应该来这里。 如果 MAC 地址有、则这是一个错误
    //未编程到器件中。 退出程序。
    //告知用户没有 MAC 地址
    //
    UARTprintf ("未对 MAC 进行编程!\n");
    while (1)
    {
    }
    }
    
    //
    //告诉用户我们现在正在做什么。
    //
    UARTprintf ("正在等待 IP.\n");
    
    //
    //将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 MAC
    //对硬件寄存器进行编程所需的地址,然后对 MAC 进行编程
    //将地址输入以太网控制器寄存器。
    //
    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);
    
    //
    //使用 DHCP 初始化 lwIP 库。
    //
    lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);
    
    //
    //设置设备定位服务。
    //
    
    echo_init();
    
    //
    //设置中断优先级。 我们将 SysTick 中断设置为更高的值
    //优先级比以太网中断高,以确保文件系统
    如果 SysTick 在以太网处理程序运行时发生、则处理// tick
    //已处理。 这很可能是因为所有 TCP/IP 和 HTTP 工作都是
    //在以太网中断上下文中完成。
    //
    MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
    MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
    
    //
    //循环永久、处理 LED 闪烁。 所有工作都在中完成
    //中断处理程序。
    //
    while (1)
    {
    //
    //等待 SysTick 中断指示更改的状态
    // LED。
    //
    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);
    }
    
    }
    
    char tcp_buffer[4096]={0};
    静态 void close_conn (struct tcp_pcb *pcb)
    {
    tcp_arg (PCB、NULL);
    tcp_sent (PCB、NULL);
    tcp_recv (PCB、NULL);
    tcp_close (pcb);
    }
    static err_t echo_recv (void *arg、struct tcp_pcb * pcb、struct pbuf * p、err_t err)
    {
    int i;
    int len;
    char *p;
    
    如果(err =ERR_OK && p != NULL)
    {
    tcp_recved( pcb,p->t_t_len );
    
    PC =(char *) p->payload;
    len =p->t_t_len;
    
    for (i=0;i tcp_sndbuf( PCB ))
    len = tcp_sndbuf( pcb );
    
    tcp_write( pcb、tcp_buffer、len、0 );
    
    tcp_sent( pcb,NULL );
    }
    其他
    {
    pbuf_free (p);
    }
    
    if (err =ERR_OK && p =NULL)
    {
    close_conn( PCB );
    }
    
    返回 ERR_OK;
    }
    静态 ERR_t ECHO_ACCEPT (void *arg、struct tcp_pcb * pcb、err_t err)
    {
    //此宏可避免在构建时发出警告
    LWIP_unused_arG( arg );
    LWIP_unused_arG( err );
    
    
    tcp_setprio( pcb、tcp_prio_min );
    
    tcp_recv( pcb、eco_recv );
    
    tcp_err( pcb,NULL );
    
    tcp_poll (PCB,NULL,10);
    返回 ERR_OK;
    }
    void echo_init( void ){
    
    struct tcp_pcb *tcp_pcb;
    
    //创建新的 TCP 连接标识符(PCB)。
    tcp_pcb = tcp_new();
    
    tcp_bind (tcp_pcb、ip_ADDR_any、23);
    
    tcp_pcb = tcp_listen ( tcp_pcb );
    
    tcp_accept ( tcp_pcb、echo_accept );
    }