硬件平台描述:
stm32F407+DM9162做tcp服务器端,上位机作客户端,通信协议为MODBUS TCP
问题还原:
正常工作情况下,拔掉网上超过6秒会出现网络故障,modbus通信一直失败,必须重启单片 机。
原因分析:
通过上位机ping仍然正常。使用Wireshark抓包发现TCP仍然处于连接状态,但modbus tcp协议不回应。说明:网络连接正常,但502端口通信有问题,可能是端口在断线后相关资源并未释放。
在线调试:
debug过程中在“tcp_server_thread”线程中故障状态下断点并不执行到,但“ethernetif_set_link”线程正常执行,但状态寄存器读出数据一直是0x00ffff。所以无法按照一般的解决方案,通过连接状态判定处理。只能从接收超时来判断并释放之前绑定的资源。
具体实施:
查看netconn结构体发现接收超时recv_timeout属于未定义状态,改变定义声明。
在TCP线程中增加接收超时时间,定为5000ms;
在判断接收超时后,关闭和删除
结果:
烧写程序后,重复网线热插拔,间隔10s,通信恢复正常。但在cubemx重新初始化后发现接收超时重新定义为0。
仔细查看才发现有高级参数设置,如下图:
设置完成后,网线热插拔问题解决!
stm32平台下MODBUS TCP网线热插拔故障处理
最新推荐文章于 2022-06-13 11:06:27 发布