GD32F470+lwip 丢包问题分析及解决

        最近在用GD32和管理机之间用TCP协议开发一个功能,功能都没问题,后面跑大量发包时候的连续测试时,总是会出现偶发性的,大概几分钟到数十分钟的一次丢包。尽管在应用层做了超时机制,一旦超时就会重新建立socket链接并重新发包,但是这样做太丑陋了,而且断开重连延时太大了,还是想彻底搞清楚这个个问题。所以先抓包吧。

管理机使用TCP dump抓包,要加-v选项,不然后面无法从通信流程上看到问题所在(最开始没加,以为是其它问题,愣是分析了半天也没想出所以然)。注意:cksum 0x5295 (incorrect -> 0x0026)的字样不是说我校验和没对,而是校验和的计算是放在了mac控制器硬件计算,而tcpdump抓包的时候,处于mac计算之前,所以这时候检验和不对是正常的,这个功能叫做offload,可以关闭的。

然后在GD32中打开lwip的debug选项,也进行了抓包

抓完包之后,进行分析,由于篇幅有限就不放全部的抓包日志了,跟大家讲下这中间发生了什么。

先看管理机tcpdump日志,我的程序会发送数据位25字节大小的报文,GD32收到并执行操作后返回12字节的报文,就是一来一回这样收发。

可以看到前面25,12,25,12,交替的报文收发是正常的,但是突然就有

GD32F470是一款基于STM32系列的微控制器,它集成了以太网功能(ENET),让你能够在嵌入式系统中实现网络通信。为了能够通过ENET模块ping通一台设备,你需要完成以下几个关键步骤: 1. **初始化硬件**:首先,配置ENET控制器,包括MAC地址、PHY地址以及网络模式(如自动协商或硬设模式)。 ```c // 初始化ENET HAL_ETH_Init(&heth); ``` 2. **设置IP地址和子网掩码**:为ENET分配一个有效的IP地址和子网掩码,这通常是IPv4的形式。 ```c HAL_ETH_IPConfig(&heth, IP addresses, Subnet mask, Gateway address); ``` 3. **启用网络接口**:开启ENET的广播和组播功能,并开始数据发送。 ```c HAL_ETH_Start(&heth); ``` 4. **设置TCP/IP堆栈**:如果你使用的是RTOS,还需要配置相关的TCP/IP协议栈,比如LwIP,来处理网络连接和数据包处理。 5. **创建并配置ping程序**:编写一个ping请求函数,利用库提供的API发送ICMP Echo Request(ping命令的基础)。 6. **发送ping请求**:发送一系列的ping请求到目标IP地址,接收Echo Reply响应。 7. **解析和检查回应**:从接收到的数据包中确认是否收到Echo Reply,如果收到,表示ping成功。 8. **处理异常和错误**:捕获并处理可能出现的网络错误,如超时或丢包。 完成后,你就能看到ping命令的输出结果了。如果ping失败,可能需要检查网络配置、物理连接或者路由器设置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值