LWIP使用RAW API实现UDP回传昌数据失败

板子:STM32F103VE
网卡:ENC28J60

基于STM32F103使用LWIP,使用RAW API实现UDP回传实验
当调试助手发送的数据小于1455字节的时候,能够正常回显

img

当发送数量大于等于1455字节的时候,调试助手不能收到回显

img

我在UDP回调函数里面打印了信息,一旦它被调用(即收到调试助手的数据)就会通过串口打印信息。
当调试助手发送的数据小于1455字节的时候,能够正常打印。

img

当发送数量大于等于1455字节的时候,不能打印。这似乎说明回调函数没有被调用

同样的当调试助手发送的数据小于1455字节的时候,WireShark抓包正常。

img

当发送数量大于等于1455字节的时候,抓不到单片机发过来的包。这似乎更加印证是回调函数没有被调用。

img

我不知道为什么会这样,网上说的方法我试过都不行。

下面是UDP回调函数,LWIP与UDP初始化函数

img

下面是lwipopts.h文件

img

【以下回答由 GPT 生成】

// UDP回调函数
void udp_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
    // 打印收到的数据
    for (int i = 0; i < p->len; i++)
    {
        printf("%c", ((char *)p->payload)[i]);
    }
    printf("\r\n");

    // 发送回复数据
    udp_sendto(pcb, p, addr, port);

    // 释放pbuf
    pbuf_free(p);
}

// LWIP与UDP初始化函数
void init_lwip(void)
{
    // 初始化LWIP
    lwip_init();

    // 创建UDP PCB
    udp_pcb *pcb = udp_new();

    // 绑定IP地址和端口
    ip_addr_t ipaddr;
    IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
    udp_bind(pcb, &ipaddr, PORT);

    // 注册回调函数
    udp_recv(pcb, udp_callback, NULL);
}

// lwipopts.h文件内容
#define IP_ADDR0   192
#define IP_ADDR1   168
#define IP_ADDR2   1
#define IP_ADDR3   100
#define PORT       5000

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^