stm32平台下MODBUS TCP网线热插拔故障处理

硬件平台描述:
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。
仔细查看才发现有高级参数设置,如下图:
在这里插入图片描述
设置完成后,网线热插拔问题解决!

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值