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:LWIP UDP 接收帮助

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/586128/ccs-tm4c1294ncpdt-lwip-udp-receive-help

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

Howdy、

我正在尝试在自己的电路板上的 tm4c1294ncpdt 上实施 LWIP、以便仅接收来自源 IP 的一致多播数据包。 我已经附上了我目前为止根据 lwip 文档和此论坛上的其他帖子所做的工作。 如果有人有任何指示或发现任何错误、这些错误将会非常有帮助。 我没有

1.收到 UDP 报文时、如何/在何处访问其最终数据负载?

2.是否有办法监听不是针对我的、长度特定的数据包?

3. lwip 如何与 pbuf 交互?

UDP_REcv 需要哪种回调?

感谢您的任何帮助。

#define ipaddress 0xA9FEB95D
#define netmask 0xFFFFFF0000
#define 网关0
#define 端口号0
//
//定义设置系统时钟。
//
//
#define SYSTICKHZ 100
#define SYSTICKMS (1000/SYSTICKHZ)

//
//
//中断优先级定义。 这些值的前3位是
//值较低表示优先级较高的中断。
//
//
#define SysTK_INT_PRIORITY 0x80
#define ETHERNET_INT_PRIORITY 0xC0
//
//
//当前 IP 地址。
//
//
uint32_t g_ui32IPAddress;


// I2C 主设备实例数据
tI2CMInstance g_sI2CInst;
//用于回调函数的布尔变量
volatile bool g_bLSM303DLHCCMagDone;
//lsm303dlhc (磁力计)实例数据
tLSM303DLHCMag g_sLSM303DLHCMag;
//用于存储从磁力计读取的数据的数组
uint_fast16_t g_fMag[3];
void Maginthandler (void);
静态空 MagCallback (void *pvCallbackData,uint_fast8_t ui8Status);
void MagInit (void);
float getHeading (void);
struct udp_PCB * upcb;
//
//
// lwIP 库支持任何与主机相关的计时器函数所需的。
//
//
空 lwIPHostTimerHandler (空)

uint32_t ui32Idx、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 打开浏览器并输入 IP 地址。\n");

//
//保存新的 IP 地址。
//
G_ui32IPAddress = ui32NewIPAddress;

//
//关闭 GPIO。
//
// map_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1);

//
//如果没有 IP 地址。
//
if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff))

//
//循环浏览 LED 动画。
//

对于(ui32Idx = 1;ui32Idx < 17;ui32Idx++)

//
//切换 GPIO
//
// map_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、
//(MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^
// GPIO_PIN_1));

SysCtlDelay (120000000/(ui32Idx << 1));


//
//
// SysTick 中断的中断处理程序。
//
//
无效
SysTickIntHandler (空)

//
//调用 lwIP 计时器处理程序。
//
lwIPTimer (SYSTICKMS);

int main (空)

//使用25MHz 外部振荡器将时钟频率设置为120MHz
uint32_t freq = SysCtlClockFreqSet (SYSCTL_OSC_MAIN|SYSCTL_USE_PLL|SYSCTL_XTAL_25MHz | SYSCTL_CFG_VCO_480、120000000);
//配置项目的所有引脚并启用外设
pinconfig();
//启用浮点单元
FPUEnable();
//以太网-------------------------------------------------------

uint32_t ui32User0、ui32User1;
uint8_t pui8MACArray[8];
//为周期性中断配置 SysTick。
MAP_SysTickPeriodSet (120000000 / SYSTICKHZ);
map_SysTickEnable();
map_SysTickIntEnable();
MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
//为的以太网控制器过滤配置硬件 MAC 地址
//传入数据包。 MAC 地址将存储在非易失性存储器中
// USER0和 User1寄存器。
map_FlashUserGet (&ui32User0、&ui32User1);
if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)

//我们永远不应该来这里。 如果 MAC 地址有、则这是一个错误
//未编程到器件中。 退出程序。
//告知用户没有 MAC 地址
// UARTprintf ("未对 MAC 进行编程!\n");
while (1)



//将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);
//使用静态 IP 初始化 lwIP 库
lwIPInit (120000000、pui8MACArray、ipaddress、netmask、gateway、IPADDR_USE_STATIC);
// showServerInfo();
upcb = udp_new();
ERR_t 错误= UDP_BIND (upcb、IP_ADDR_ANY、端口号);
UDP_recv (upcb、UDPRecvData、NULL);
struct pbuf * udp_pbuf = pbuf_alloc (PBUF_transport、131、PBUF_ROM);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    以太网数据包(或帧)可以跨越多个 pbuf、作为单独链接的列表进行链接。 udp_recv 用于为传入的 UDP 数据设置回调。 当在指定连接上接收到 UDP 数据报时、应调用回调函数。 回调函数还负责取消分配 pbuf。 在您的代码中、您将看到回调 UDPRecvData。 但是、我在您的代码中看不到回调函数。 UDP_recv 的函数协议为:

    void udp_recv (struct udp_pcb * pcb、err_t (* recv)(void * arg、struct udp_pcb * upcb、struct pbuf * p、struct ip_addr * addr、u16_t port)、 void * recv_arg);

    接收到的数据报数据包缓冲区与 addr 中的数据报源地址和端口中的源端口一起保存在 p 中。

    我不是 LwIP 的专家、我对 LwIP 的了解程度更高。 如果您需要 LwIP 的进一步帮助、我建议您直接将问题发布到 savannah.nongnu.org/.../的 LwIP 邮件列表 中、或者希望一些社区专家可以提供进一步的指导。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、这是在我的最后一个帖子的第一行之后、而是在我的最后一个帖子的第一行之前。 我们现在可以编译并运行该文件、但最终会进入 IntDefaultHandler、无法弄清其中的原因。



    void UDPRecvData (void *arg、struct udp_pcb * pcb、struct pbuf * p、ip_addr_t * addr、u16_t port)

    LWIP_unused_arg (arg);
    pbuf_free (p);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请确保在矢量表中具有正确的以太网 ISR 矢量。 以太网位于矢量56或中断40处。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请详尽说明。 我将在中断挂起向量编号寄存器中获得一个 NVIC 中断挂起寄存器位以及56。 这是不是由于在 lwip 的某个位置设置了中断处理而导致的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找到了中断矢量表、并按照 lwip 示例的具体方式添加了中断处理程序、现在我一直停留在无限循环中。 现在的问题是未调用回调函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否详细说明无限循环发生在何处?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Justin。
    将端口号从0更改为4096到65519之间的任何值(不是最多65535)
    下载 LwIP 2.0.2并使用新版本覆盖库。 通常、问题出在 处理空缓冲区的 tcp_out.c、tcp_in.c 和 udp.c 内、但使用2.0.2V 时、您的问题似乎已经解决。

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

    你好 Justin。 它可与 GCC/G++编译器配合使用。 别忘了保留旧库的备份。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我一直在努力避免为此项目切换编译器、因为我们长期以来一直在开发该项目。