板子:STM32F103VE
网卡:ENC28J60
基于STM32F103使用LWIP,使用RAW API实现UDP回传实验
当调试助手发送的数据小于1455字节的时候,能够正常回显。
当发送数量大于等于1455字节的时候,调试助手不能收到回显。
我在UDP回调函数里面打印了信息,一旦它被调用(即收到调试助手的数据)就会通过串口打印信息。
当调试助手发送的数据小于1455字节的时候,能够正常打印。
当发送数量大于等于1455字节的时候,不能打印。这似乎说明回调函数没有被调用。
同样的当调试助手发送的数据小于1455字节的时候,WireShark抓包正常。
当发送数量大于等于1455字节的时候,抓不到单片机发过来的包。这似乎更加印证是回调函数没有被调用。
我不知道为什么会这样,网上说的方法我试过都不行。
下面是UDP回调函数,LWIP与UDP初始化函数
下面是lwipopts.h文件
【以下回答由 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