先上我的程序:
err_t
ethernetif_input(struct netif *netif)
{
struct ethernetif *ethernetif;
// struct eth_hdr *ethhdr;
struct pbuf *p;
err_t err;
ethernetif = netif->state;
printf("已进入ethernetif_input.\r\n");
/* move received packet into a new pbuf */
p = low_level_input(netif);
printf("low_level_input已返回.\r\n");//这条语句有输出,说明程序执行了这条语句
/* no packet could be read, silently ignore this */
if (p == NULL)
{
printf("p=NULL.\r\n");
return ERR_MEM;}
//这里是我参照ST官方的方法进行移植的代码,我们不打算在这个函数里进行数据的提交
//而是调用netif->input回调函数来进行数据的分析和提交
err = netif->input(p, netif);
printf("netif->input已返回.\r\n");
if (err != ERR_OK)
{
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
pbuf_free(p);
p = NULL;
}
return err;
//下面是官方的处理方式,他们是打算由这个函数对接收的数据进行处理,然后根据数据类型的不同,递交上层
//分ip和arp两种类型进行处理
/* points to packet payload, which starts with an Ethernet header */
// ethhdr = p->payload;
// switch (htons(ethhdr->type)) {
/* IP or ARP packet? */
// case ETHTYPE_IP:
// case ETHTYPE_ARP:
//#if PPPOE_SUPPORT
/* PPPoE packet? */
// case ETHTYPE_PPPOEDISC:
// case ETHTYPE_PPPOE:
//#endif /* PPPOE_SUPPORT */
/* full packet send to tcpip_thread to process */
// if (netif->input(p, netif)!=ERR_OK)
// { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
// pbuf_free(p);
// p = NULL;
// }
// break;
// default:
// pbuf_free(p);
// p = NULL;
// break;
// }
}
串口打印数据输出:
已进入ethernetif_input.
已进入low_level_input.
EIR=72.
已进入enc28j60PacketReceive.
EIR=72.
EIR=72.
EIR=8.
enc28j60PacketReceive返回.
20000160
enc28j60PacketReceive已返回.
接收到的数据长度len=60.
EIR=8.
low_level_input已返回.
这是整个调试信息和程序,其中LWIP初始化中netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);且在ethernet_input函数中我也放进去了串口输出,但为什么在low_level_input函数返回以后,函数下面的所有语句都没有数据显示?也就以为着,跟踪过程丢失,程序不知道跑哪里去了?怎么回事? |