W5500KeepAlive功能除錯經驗

2022-11-11 05:33:02 字數 980 閱讀 6604

2023年2月21日

17:39

w5500在實際專案應用時遇到client可能會異常中斷和板卡的連線。軟體

程式控制斷開連線,實際上由於種種原因未斷開,使得板卡進入某種臨界狀態,且無法恢復。

根本原因是驅動庫的接收函式為阻塞型,在沒有報文接收時會阻塞在該函式內部,當外部client進行某種異常斷開後,socket的狀態得不到及時更新,認為當前依然在狀態,依舊阻塞。而client恢復後無法再次連線該埠,造成死鎖。

解決辦法是在程式內增加keepalive幀,異常阻塞超過一定時間後讓w5500自動關閉該socket,跳出該阻塞

w5500使能keepalive功能分兩種方式:1、自動傳送

2、手動傳送

使用這種方式前都需要設定乙個timeout的時間引數,setrcr()和setrtr()

setrtr()為設定超時時間,單位為5s,一般預設即可

setrcr()為設定超時次數,在檢測到網路上無訊息傳送時傳送keepalive報文,若無響應超過該次數則關閉socket,進而更新socket的狀態

也可以直接呼叫ctlnetwork(cn_set_timeout, (void *)&gwiznettimeout);這個函式,其中第二個引數為配置值,使用者需指定。

其中自動模式要注意:

一、初始化時對應socket用setsn_kpalvtr(sn, 0x01);第二個引數為非0即可

無需再額外寫**。此處w5500晶元有自動處理機制,若在設定時間內有資料收發,則預設不傳送keepalive幀。若設定的超時時間為5s,重試次數為2次,只要在connect成功後我們保持10s以上不發資料就可以通過wireshark檢測到keepalive幀

二、手動模式要設定兩處:

1、setsn_kpalvtr(sn, 0x00);在初始化**中放置,第二個引數必須為02、iinchip_write(sn_cr(sn),sn_cr_send_keep);在主迴圈或定時任務中

分割槽問題分析及總結的第1頁