freeModbus TCP收发数据一段时间后,出现掉线情况(time out问题)

话说这个是真难找啊。我仅仅发表我找到的问题。

我在接收几十到几百次数据的时候,会出现连接超时,也就是time out。而且ping也ping不通。也就是说明lwip出了问题。

首先我先介绍modbus的这个流程。

首先是函数

 eMBTCPInit( MB_TCP_PORT_USE_DEFAULT )

我们进入看看做了什么。主要函数为:

eMBTCPDoInit( ucTCPPort )||vxMBTCPPortInit( ucTCPPort )||v
tcp_new()---->tcp_bind()---->tcp_listen()---->tcp_accept()

重点在于这个函数,这里设置了回调。我们看看这个设置的回调函数:

tcp_accept( pxPCBListenNew, prvxMBTCPPortAccept );这里的prvxMBTCPPortAccept ||调用了vtcp_recv( pxPCB, prvxMBTCPPortReceive );

我们看看tcp_recv,发现其主要是设置了接受回调函数,当收到数据后,调用接受函数来处理tcp帧。

进入这个函数看看

err_t 
prvxMBTCPPortReceive( void *pvArg, struct tcp_pcb *pxPCB, struct pbuf *p, err_t xErr )||v
tcp_recved( pxPCB, p->len );这个内部调用了一个接收函数。||进入这个tcp_recved函数vif (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {tcp_ack_now(pcb);tcp_output(pcb);
}

我们发现这里,三行的意思是:

        如果之前你通告的窗口很小甚至 0(对端几乎/完全停发),你现在一下子释放了不少空间,就马上通知对端“可以继续冲了”,避免对端等到延迟 ACK 定时器或其他机会才知道 → 降低停顿时延。

        同时不对每个很小的释放都即时发 ACK(那样 ACK 会太多),所以设置阈值来折中ACK 数量和时延。

也就是说,只有你一次性释放 ≥ 730 字节(我这里是这么大)窗口时才会立刻发 ACK。

        大家可以仿真到这里,打上断点,看看能不能进入这个判断中。如果都出现报错了还是进不去,就说明这个设置太大了。你应该设置的小点,或者删去判断,一帧一个ack。     

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920241.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Web环境一键安装脚本集合(非docker)

✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨ —— 专为开发者打造的宝藏基地,等你来探索! 这里有: 🔥 硬核技术干货:编程技巧、开发经验、踩坑指南,带…

原生安卓#基于Android的爱好者分享论坛的设计与实现/基于Android在线论坛系统app/基于Android的论坛系统的设计与实现的设计与实现

原生安卓#基于Android的爱好者分享论坛的设计与实现/基于Android在线论坛系统app/基于Android的论坛系统的设计与实现的设计与实现

基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android

基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android

C++14 到 C++20 全面解析:语言新特性、标准库演进与实战案例

一、前言C 作为一门历史悠久且不断演进的编程语言,在 C11 之后进入了“现代化”的快车道。C11 被称为 C 的第二次诞生,引入了 lambda 表达式、智能指针、右值引用、并发支持等革命性特性。然而,C 的标准化进程并没有止步于此。C14、C17 和 C2…

HarvardX TinyML小笔记2(番外1:TFLite)

1 原理 tflite就是Tensorflow的轻量化模型,核心处理就是量化和剪枝。不过这部分目前是在Tensorflow中封装了,所以这里也不会去看细节,主要就是看看原理和使用方法。 量化Quantization,其实就是把原来的float32换成int8。这样一个…

向量库Qdrant vs Milvus 系统详细对比

Qdrant vs Milvus 系统详细对比 一、它们是什么(定位) 两者都是专门做向量相似搜索的数据库:支持ANN(近似最近邻)检索、向量结构化过滤、REST/gRPC 接口与官方SDK;Milvus 官方也定位为"面向GenAI、可…

适配欧拉操作系统

背景 客户指定服务器环境欧拉操作系统,版本:6.6.0-72.0.0.76.oe2403sp1.x86_64 需要把Java 应用以及各种中间件部署在欧拉操作系统上。 问题适配MySQL 1.1 编译报错 mysql-5.7.40-el7-x86_64.tar.gz版本在CentOS7环境安装正常 当前欧拉环境直接使用CentO…

学习spring Bean的生命周期

完整项目结构 ├── pom.xml └── src/├── main/│ ├── java/│ │ └── com/│ │ └── zhang/│ │ ├── bean/│ │ │ ├── Address.java│ │ │ ├── MyBeanPostProcessor.java│ │ …

elasticsearch 7.17.23 使用spring data es实现高亮分页,scroll查询分页查询

一 介绍 1.1 工程结构 1.2 启动elasticsearch服务 1.3 高亮分页 DeepSeek 代码 效果: 1.4 scroll分页 代码 2.效果 后台日志 1.5 完整代码 https://gitee.com/jurf-liu/es-2.17.x-demo.git

onlyoffice整合springboot+vue实现文档在线编辑保存

项目上需要用到在线word、excel文档编辑功能,通过游览器在线打开一个远程的word文档编辑保存,这里记录下整合思路。 onlyoffice简介 ONLYOFFICE 是一款开源的办公套件,提供了一系列在线文档编辑和协作工具,适用于团队和个人使用…

Linux笔记10——shell编程基础-4

补充$#——取参数个数“$n”,有值取值,无值取空字符,一般都会加引号,在某些情况下避免报语法错误一、read接收键盘输入[rootlocalhost ~]# cat demo.sh #!/bin/bash echo -n "请输入你的姓名:" read nameecho "你…

(Redis)过期删除策略

1. 背景Redis 支持为 Key 设置过期时间(TTL),让数据在一定时间后自动失效。 例如:SET session:1001 "userA" EX 60 # 60 秒后过期但是问题来了:Key 到期后,Redis 什么时候、如何删除它&#xf…

nodejs 集成mongodb实现增删改查

初始化项目: npm init -y npm install mongoose -save 安装mongoose 插件 mongoose 链接数据库语法: mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame: 用户名 passwrod: 密码 host1:port1,host2:port…

音视频学习(五十八):STAP-A模式

什么是 STAP-A? STAP-A 是一种特殊的 RTP 封装机制,专为 H.264 和 H.265 这类视频编码协议设计。它的核心目的只有一个:将多个小的 NALU(网络抽象层单元)打包进一个 RTP 包中,以此来减少网络开销&#xff0…

管理型交换机通过VLAN划分实现不同IP跨网段通信配置方法

管理型交换机应用场景丰富,如果要实现不同IP跨网段通信(比如172.22.106.X和192.168.100.X实现通信),通过VLAN划分是可以满足,下面分享基于弱三层交换机RTL9301方案核心模块SW-24G4F-301EM配置方法! 1. 一般结合交换机的应用场景&a…

什么是高防服务器?如何进行防御?

高防服务器是指能为用户提供防御网络攻击,是主要针对DDOS等流量型攻击能力的服务器,通过部署专业的硬件设备与软件系统,具备高带宽、大流量清洗能力,能有效抵御各类恶意流量冲击,确保服务器稳定运行,保障网…

SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度

文章目录SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度概述笔记SW版本导出时,选择STL的导出选项默认导出(精细)导出粗糙自定义导出 - 将误差和角度改为最大自定义导出 - 将误差,角度,三角面数改为最大备注这几天的感想关于我不参考人家零件&…

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例

四十一、【高级特性篇】API 文档驱动:OpenAPI/Swagger 一键导入测试用例 前言 准备工作 第一部分:后端实现 - OpenAPI 解析与批量创建 API 1. 创建 OpenAPI 解析服务 2. 创建批量用例导入 API 3. 注册新 API 路由 第二部分:前端实现 - OpenAPI 导入界面 1. 更新 `api/testca…

K8S-Service资源对象

一、概述在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资源&…

【STM32】CubeMX(十三):RT-THREAD

本篇博客描述的是 RT-Thread STM32 CubeMX 的使用方法。本文也为大家提供了基于 STM32 使用 CubeMX 添加 RT-Thread 并创建闪烁 LED 任务 的操作流程。 便于您更好的理解。 一、RT-Thread 是什么? RT-Thread 是一个开源、轻量级的实时操作系统,适用于…