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.
工具/软件: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);
}
你好 Justin。
将端口号从0更改为4096到65519之间的任何值(不是最多65535)
下载 LwIP 2.0.2并使用新版本覆盖库。 通常、问题出在 处理空缓冲区的 tcp_out.c、tcp_in.c 和 udp.c 内、但使用2.0.2V 时、您的问题似乎已经解决。
你好 Justin。 它可与 GCC/G++编译器配合使用。 别忘了保留旧库的备份。