Lwip协议中网络接口(netif)无法ping通解决方法
提出问题:
在调试单板网络通信的时候,发现:
1、打开上位机软件,并连续发送读取数据指令。
2、接上网络线,给单板供电,上位机软件能正确接收到数据;断开单板电源,重新给单板供电,上位机能正确接收到数据;频繁几次开关机测试,上位机依然能正确接收到数据。
3、在单板供电的情况下,带电插拔网络线,上位机能正确接收到数据。
4、断开网线,给单板供电,等待一段时间后,插上网络线;上位机无法接收到数据。频繁测试几次,每次上位机都无法接收到数据。
解决问题:
1、根据测试结果分析,先连接好网络线后给单板供电,网络通信正常;先给单板供电后接网络线,网络通信异常。
2、首先怀疑硬件的问题,开机的时候PHY芯片由于时序的问题没有启动;更换PHY芯片外围电阻,进行测试,问题依然没有解决。
3、排除硬件问题,考虑软件问题,借助IDE的调试功能模拟开机的过程;发现不接网络线给单板供电,网络接口无法启用;
4、逐步排查PHY芯片初始化过程,lwip协议初始化过程后,发现PHY芯片启动了自协商功能;在连接网络线的情况下,PHY芯片与PC机自动协商连接速度与工作模式;在没有网络线的情况下,自动协商功能超时,网络接口无法连接(link down)。
5、将自动协商功能关闭,并手动设置连接速度与工作模式,进行测试,通信正常;频繁几次测试后;通信依然正常。
延伸:
lwip协议都是抽象层,物理层的驱动需要依据不同的PHY芯片手动编写;然后在链接(link up)到lwip协议中。
lwip定义了通用的网络接口结构
struct netif{
struct netif *next;
#if LWIP_IPV4
ip_addr_t ip_addr; //IP地址
ip_addr_t ip_netmask; //子网掩码
ip_addr_t ip_gw; //默认网关
#endif /* LWIP_IPV4 */
#if LWIP_IPV6
ip_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES];
ip_addr_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
#endif /* LWIP_IPV6 */
netif_input_fn input; //网络设备驱动调用,传递一个数据包到TCP/IP
#if LWIP_IPV4
netif_output_fn output; //发送数据包时,由IP模块调用。发送数据时,首先解析硬件地址然后发送数据。
//对以太网物理层,这个函数是etharp_output();
#endif
netif_linkoutput_fn linkoutput; //发送数据时,由etharp_out()函数调用
#if LWIP_IPV6
netif_output_ip6_fn output;
#end /* LWIP_IPV6 */
#if LWIP_NETIF_STATUS_CALLBACK
netif_status_callbcak_fn status_callbcak;
#endif /* LWIP_NETIF_STATUS_CALLBACK */
#if LWIP_NETIF_LINK_CALLBCAK
netif_status_calbcak_fn link_callbcak;
#endif /* LWIP_NETIF_LINK_CALLBCAK */
#if LWIP_NETIF_REMOVE_CALLBCAK
netif_status_callback_fn remove_callbcak;
#endif /* LWIP_NETIF_REMOVE_CALLBCAK */
void *state;
#ifdef netif_get_client_data
void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA];
#endif
#if LWIP_IPV6_AUTOCONFIG
u8_t ip6_autoconfig_ebabled;
#enif
#if LWIP_IPV6_SEND_ROUTER_SOLICIT
u8_t rs_count;
#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */
#if LWIP_NETIF_HOSTNAME
const char* hostname;
#endif /* LWIP_NETIF_HOSTNAME */
#if LWIP_CHECKSUM_CTRL_PER_NETIF
u16_t chksum_flag;
#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
u16_t mtu; //最大发送字节数
u8_t hwaddr_len;
u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
u8_t flag;
char name[2];
u8_t num;
#if MIB2_STATS
u8_t link_type;
u32_t link_speed;
u32_t ts;
struct stats_mib2_netif_ctrs mib2_counters;
#endif /* MIB2_STATS */
#if LWIP_IPV4 && LWIP_IGMP
netif_igmp_mac_filter_fn igmp_mac_filter;
#endif /* LWIP_IPV4 && LWIP_IGMP */
#if LWIP_IPV6 && LWIP_IPV6_MLD
netif_mld_mac_filter_fn mld_mac_filter;
#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */
#if LWIP_NETIF_HWADDRHINT
u8_t *addr_hint;
#endif /* LWIP_NETIF_HWADDRHINT */
#if ENABLE_LOOPBACK
struct pbuf *loop_first;
struct pbuf *loop_last;
#if LWIP_LOOPBACK_MAX_PBUFS
u16_t loop_cnt_current;
#endif /* LWIP_LOOPBACK_MAX_PBUFS */
#endif /* ENABLE_LOOPBACK */
}
- 路由器有线无法上网,此计算机上缺少一个或多个网络协议——解决方法
- XP系统可以ping通网络却无法上网的故障分析及解决方法
- 网络连接正常但无法上网(能ping通外网DNS)解决方法
- Windows下安装Apache HTTP Server 无法启动遇到OS10048 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 的问题解决方法
- Win10突然无法上网,诊断说缺少一个或者多个网络协议解决方法汇总
- ubuntu的wlan联网方法(解决NetworkManager无法监管无线网络)
- ora-12154 tns 无法处理服务名(执行的程序途径不一致导致,枚举网络数种方法,大家还有其他解决办法?)
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- 无法访问,您可能没有权限使用网络资源的解决方法
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- 安装 卸载office提示“无法访问您要使用的功能所在的网络位置”之解决方法
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- [转] "计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您是否有访问权限" 解决方法
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- LwIP网络接口结构体---netif
- 无线网络连接可用,但无法上网的解决方法
- ubuntu11.10无法启动无线网络的解决方法
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇
- 关于“计算机无法访问,您可能没有权限使用网络资源....”的解决方法