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
英文地址,請注明出處:http://en.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 是一個開源、輕量級的實時操作系統,適用于…