STM32
直播中

李志静

7年用户 1385经验值
私信 关注
[问答]

STM32+LWIP通信12次后无法再次通信怎么解决?

各位大佬,小弟在尝试移植LWIP+FREERTOS的时候出现了如下问题,请各位大佬帮忙看看是哪里的问题,我用了FreeRTOS+LWIP做ModbusTCP时出现了链接出现通信12次然后通信中断,并且再也没法ping 通的问题,表现的现象是进不去以太网中断,导致 ethernetif_input()接收不到数据
移植过程是这样的:(STM32F407+DP83848)

1:首先移植RTOS+固件库,移植成功,并且跑了几个串口通信的任务,测试大概两三天的样子,并没有出现问题。
2:移植LWIP1.4.1 (从ST官网下载的那个网页的例程,修改引脚定义后跑在板子上没问题,确认硬件没问题)
3:将ST官网的LWIP1.4.1 的例子(关于LWIP的部分)移植到步骤1 的FreeRTOS 系统的工程里面,只是添加LWIP初始化的任务,并没有调用任何接口的情况下可以Ping 通 而且长时间Ping 也没问题。
4:调用一个连接,编写函数,将受到的数据发送回去,出现了通信12次就没法在通信的问题(发12次,收12次,通信数据包无论长短,都是12次)而且ping 也ping 不通了。
5:自己写了Modbus-TCP的代码,也是同样的通信12次,也没法通信了,
请教各位大佬,有遇到过类似的情况吗?

回帖(1)

远不及你

2024-7-24 17:36:56
根据你的描述,问题可能出现在以下几个方面:

1. **内存泄漏**:在LWIP和FreeRTOS的组合使用中,内存泄漏是一个常见问题。请检查你的代码,确保所有动态分配的内存在使用完毕后都得到了释放。

2. **TCP连接管理**:确保你的TCP连接管理正确。LWIP的TCP连接是有限的,如果连接没有正确关闭,可能会导致无法建立新的连接。检查你的TCP连接关闭逻辑,确保在不需要连接时及时关闭。

3. **网络中断处理**:你提到无法进入以太网中断,这可能是中断处理的问题。检查你的中断服务程序(ISR)是否正确配置,以及是否有其他中断源干扰。同时,确保你的中断优先级设置正确。

4. **LWIP配置**:检查LWIP的配置文件,确保所有参数设置正确。特别是与网络性能和稳定性相关的参数,如TCP窗口大小、TCP重传次数等。

5. **硬件问题**:虽然你已经确认硬件没有问题,但仍然建议检查网络接口(如DP83848)的工作状态,确保没有硬件故障。

6. **ModbusTCP实现**:检查你的ModbusTCP实现是否正确。确保遵循ModbusTCP协议规范,特别是在处理TCP连接和数据帧方面。

7. **系统资源监控**:使用FreeRTOS的系统监控工具,如任务列表、内存使用情况等,来检查系统资源的使用情况。这有助于发现潜在的问题,如资源耗尽、任务切换异常等。

8. **调试和日志**:增加详细的调试日志,以便在问题发生时能够快速定位问题所在。同时,使用调试工具(如ST-Link)来跟踪程序的执行过程。

解决这个问题的步骤:

1. **检查内存泄漏**:使用内存检测工具(如Valgrind)检查你的程序是否存在内存泄漏。

2. **优化TCP连接管理**:确保TCP连接的建立和关闭逻辑正确,避免连接泄漏。

3. **检查中断处理**:确保中断服务程序正确配置,没有其他中断源干扰。

4. **调整LWIP配置**:根据需要调整LWIP的配置参数,以提高网络性能和稳定性。

5. **检查硬件状态**:使用硬件诊断工具检查网络接口的工作状态。

6. **审查ModbusTCP实现**:确保你的ModbusTCP实现遵循协议规范。

7. **使用系统监控工具**:监控系统资源使用情况,发现潜在问题。

8. **增加调试日志**:在关键位置增加调试日志,以便快速定位问题。

通过以上步骤,你应该能够找到问题所在并解决它。如果问题仍然存在,建议寻求社区或专业人士的帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分