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.

[参考译文] 编译器/EK-TM4C1294XL:EK-TM4C1294NCPDT

Guru**** 2562120 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/846186/compiler-ek-tm4c1294xl-ek-tm4c1294ncpdt

器件型号:EK-TM4C1294XL

工具/软件:TI C/C++编译器

我正在处理 enet_uIP、当我通过数据包发送器发送 UDP 数据包时、它正在工作。  

我现在要做 的是、将端口编号为2048的数据包从 PC 发送到微控制器、然后将端口2049上具有不同数据包字长的数据包从微控制器发送回 PC。  

因此、它应该像这样工作。  

PC -> MC (端口2048上的 UDP 封包、包含消息、例如 Test_0)

但它现在应该使用交换功能将数据包发回、其中交换了 MAC 和 IP 地址。

MC -> PC (端口2049上具有不同消息长度的 UDP 封包、如 Test_12345)

我所做的是、Swap 函数正在工作、我可以交换 MAC 和 IP 地址、以便从 MC -> PC 发回数据包  

但我不能得到的是如何在回波主函数中实现它。  

对此有任何建议吗?????

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

    您好 Atif、

     下面的链接中提供了一些 UDP 示例、这些示例将非常有用。  

    https://gist.github.com/iwanbk/1399729/f252331b6e325a7ae62614ce5da358e474dc7535

    http://ultimaserial.com/avr_lwip_udp.html

    https://lwip.fandom.com/wiki/Raw/UDP

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

    尊敬的 Charles:  

    示例看起来不错、但我仍然对如何在我的实际代码中实现这一点感到困惑。  

    我要在我的代码下面附加。 您可能会给我一些提示。  

    回波实现:  

    //
    //主应用程序循环。
    //
    i32PeriodicTimer=0;
    i32ARPTimer = 0;
    while (true)

    //
    //等待事件发生。 这可以是系统节拍事件、
    //或 RX 数据包事件。
    //
    while (!g_ui32Flags)

    //
    //如果 SysTick、清除 SysTick 中断标志并使递增
    //计时器。
    //
    if (HWREGBITW (&g_ui32Flags、FLAG_SysTick)=1)

    HWREGBITW (&g_ui32Flags、FLAG_SysTick)= 0;
    i32PeriodicTimer+= SYSTICKMS;
    i32ARPTimer += SYSTICKMS;

    //
    //检查并读取 RX 数据包。
    //
    if (HWREGBITW (&g_ui32Flags、FLAG_RXPKT))

    //
    //清除 RX 数据包事件标志。
    //
    HWREGBITW (&g_ui32Flags、FLAG_RXPKT)= 0;

    //获取数据包并为 UIP 堆栈使用设置 UIP_len。
    //
    UIP_len =(无符号短整型)封装接收器(EMAC0_BASE、UIP_Buf、
    sizeof (g_pui8UIPBuffer));

    //
    //在此处处理传入的 IP 数据包。
    //
    if (BUF->TYPE =htons (UIP_ETHTYPE_IP))

    //检查是否使用 UDP 协议
    if (IPBUF->proto = 0x11){

    //交换 MAC 地址

    macaddr[0]= IPBUF->ethhdr.src.addr[0];
    macaddr[1]= IPBUF->ethhdr.src.addr[1];
    macaddr[2]= IPBUF->ethhdr.src.addr[2];
    macaddr[3]= IPBUF->ethhdr.src.addr[3];
    macaddr[4]= IPBUF->ethhdr.src.addr[4];
    macaddr[5]= IPBUF->ethhdr.src.addr[5];

    IPBUF->ethhdr.src.addr[0]= IPBUF->ethhdr.dest.addr[0];
    IPBUF->ethhdr.src.addr[1]= IPBUF->ethhdr.dest.addr[1];
    IPBUF->ethhdr.src.addr[2]= IPBUF->ethhdr.dest.addr[2];
    IPBUF->ethhdr.src.addr[3]= IPBUF->ethhdr.dest.addr[3];
    IPBUF->ethhdr.src.addr[4]= IPBUF->ethhdr.dest.addr[4];
    IPBUF->ethhdr.src.addr[5]= IPBUF->ethhdr.dest.addr[5];

    IPBUF->ethhdr.dest.addr[0]= macaddr[0];
    IPBUF->ethhdr.dest.addr[1]= macaddr[1];
    IPBUF->ethhdr.dest.addr[2]= macaddr[2];
    IPBUF->ethhdr.dest.addr[3]= macaddr[3];
    IPBUF->ethhdr.dest.addr[4]= macaddr[4];
    IPBUF->ethhdr.dest.addr[5]= macaddr[5];

    //交换 IP 地址

    IPBUF->destipaddr[0]= IPBUF->srccipaddr[0];
    IPBUF->destipaddr[1]= IPBUF->srccipaddr[1];
    IPBUF->srcipaddr [0]= UIP_hostaddr[0];
    IPBUF->srcipaddr [1]= UIP_hostaddr[1];

    否则{
    uip_len = 0;

    PacketTransmit (EMAC0_BASE、UIP_Buf、UIP_Len);
    uip_len = 0;

    首先、我必须发送数据包

    从 PC 到端口2048上的 MC、并显示一些消息、  

    然后、我将切换源地址和目标地址、以便从发送数据包

    使用不同端口的 MC 到 PC、例如、具有不同消息长度的2049端口。  

    我有点困惑、我是否应该在回显中定义端口号、因为我正在使用数据包发送器。  

    我需要的是运行主循环、它首先从 A 点发送一个数据包到 B 点、然后等待、在此期间我可以从 B 点发送一个数据包到另一个数据包。  

    我应该如何继续????

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

    您好!

     我认为下面包含完整示例的帖子将会有所帮助。 我还建议您在向客户端发送/接收数据时使用 Wireshark 查看网络流量。 此示例将客户端设置为侦听端口23。 您可以更改为2048。  我不确定为什么需要切换源地址和目标地址。 为什么不使用请先查看示例。 这是一个回波示例。 客户端只回传从使用 sendto () API 从服务器接收到的任何内容。  

    https://e2e.ti.com/support/microcontrollers/other/f/908/t/723207

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

    在 enet_uIP 示例中:  

    UIP 使用单个缓冲器、但 MAC 需要至少3个接收描述符才能运行

    #define NUM_TX_descriptors 3.
    #define NUM_RX_descriptors 3.

    我不明白为什么 MAC 硬件需要至少3个接收描述符??

    2. SysTick 中断的 intterupt 处理程序的工作原理  

    无效
    SysTickIntHandler (空)

    //
    //递增系统节拍数。
    //
    G_ui32TickCounter++;

    //
    //表示发生了 SysTick 中断。
    //
    HWREGBITW (&g_ui32Flags、FLAG_SysTick)= 1;

    在这种情况下、我不会得到该 HWREGBITW 且等于1意味着什么?? 以及如何调用中断?

    3、还有一个函数 void EthernetHandler (void) 、我在 main 中没有看到该函数要使用。 您能解释一下它的工作时间和方式吗?

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

    您好!

     您是否有机会按照我提到的另一篇文章中所附的那样运行示例? 该示例显示了基于 LwIP UDP 的简单数据传输。  

    [引用用户="Atif Saede"]

    UIP 使用单个缓冲器、但 MAC 需要至少3个接收描述符才能运行

    [/报价]

    我不确定这3项。 您是否已更改为1并了解其工作原理? 另外、您为什么不想使用 LwIP 而是 UIP? 我猜三个描述符是为了支持正向链接的描述符列表。 有关描述符的详细信息、您可以在数据表的以太网一章中找到描述。 但是、这些都是非常低层次的细节、人们几乎不需要知道场景后会发生什么。 TCP/IP 堆栈和以太网驱动程序将硬件细节抽象出来。  

    [引用用户="Atif Saede"]

    在这种情况下、我不会得到该 HWREGBITW 且等于1意味着什么?? 以及如何调用中断?

    [/报价]

    HWREGBITW 是一个将一个位设定为高电平的函数。  FLAG_SysTick 被#def定为0。 因此、 HWREGBITW (&g_ui32Flags、FLAG_SysTick)= 1将 g_ui32Flags 寄存器的位0设置为1。

    [引用 user="Atif Saede">3. 然后是一个函数 void EthernetHandler (void) 、我在 main 中没有看到该函数要使用。 [/报价]

     EthernetIntHandler 是以太网模块的 ISR。 检查 startup_ccs.c 文件并搜索 EthernetIntHandler、您会发现 EthernetIntHandler 位于与以太网模块相对应的中断矢量表中。 当一个以太网中断发生时、处理器将跳转到 EthernetIntHandler ISR。 EthernetIntHandler ISR 位于 enet_uip.c 中  

     如果您不知道中断是如何工作的、我建议您使用该示例 /examples/boards/ek-tm4c1294xl/interrupts 示例。  

      

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

    您好、Charles、  

    是的、我介绍了 LwIP UDP 示例。  

    实际上、几周前我开始使用 UIP、因此我将使用此示例。  

    其次、我在 LwIP 中看不到任何 DMA、其中我应该能够接收数据包和传输数据包、并且没有缓冲区。 如果我错了、请纠正我的问题。 在 LwIP 中、它所做的是接收数据包并将其发送回指定的端口和新 IP。  

    第三、我要做的是发送数据包、数据包被接收并复制到缓冲区。 现在、数据包位于缓冲器中、

    我想知道的是扩展缓冲器中的有效载荷、并在从 MC 传输回 PC 之前更改长度。  

    数据包被接收并存储在 UIP_Buf 中、并从 PC 传输到 MC。  

    例如、附加的照片:UDP 封包  

    源端口

    目标端口。  

    3.长度

    4.校验和  

    5.数据  

    这可以在我的图片中看到。  

    现在、这个有效载荷(缓冲数据)在微控制器软件中、我只想更改数据包的有效载荷并指定我要发送的端口号。 然后将其传输回 PC。  

    在传输数据包之前、缓冲区应该只有数据和长度变化、例如从(Test_0)变为(Test_4321_echo) 加上端口号。

    您能帮我解决这个问题吗? 我尝试了一些示例、但不起作用。

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

    您好!

     我不认为继续使用 UIP 对您来说是最佳选择。 我看到不使用 RTOS 的用户将使用 LwIP。 使用 RTOS 的人员将获得用于 TCP/IP 堆栈的 TI-RTOS NDK。 正如您在 enet_uIP 中看到的。 C 示例、要求您设置 TX/Rx 描述符的级别非常低。 我认为使用 LwIP 会更好。 如果您有机会尝试基于我引用的 LwIP 的 UDP 示例、则会更容易。  

     Adam Dunkels 提供了一些 UIP 示例、他是 LwIP 和 UIP 背后的大脑。  请参阅下面的内容。  

    由 Adam Dunkels 撰写的这篇论文还包含一些有关如何向网络发送数据的示例。  

    http://www.dunkels.com/adam/download/uip-doc-0.6.pdf

    下面是另一个有关 StackOverFlow 的 UIP 问题、可能会有所帮助。

    https://stackoverflow.com/questions/25102977/send-udp-on-specific-connection-in-%c2%b5ip/25448350#25448350