03_W5500TCP_Client

上一節我們完成了W5500網絡的初始化過程,這節我們進行TCP通信,w5500作為TCP客戶端與電腦端的TCP_Server進行通信。


目錄

1.TCP通信流程圖:

?tcp的三次握手:

tcp四次揮手:

2.代碼分析:

3.測試:


1.TCP通信流程圖:
?

?tcp的三次握手:

三次握手:1.客戶端先發送標志位SYN=1,seq=x請求與服務器建立連接2.服務器收到客戶端的TCP報文后,返回標志位SYN=1,ACK=1,seq=y,ack=x+1的報文應答客戶端并同意建議連接3.客戶端收到服務器的TCP報文后,返回標志位ACK=1,seq=x+1,ack=y+1的報文表示接收到服務器的消息并建立連接

tcp四次揮手:

四次揮手:1.客戶端向服務器發送標志位FIN=1,seq=x的報文請求斷開連接2.服務器收到后,返回標志位ACK=1,seq=y,ack=x+1的報文告訴客戶端收到報文,并準備斷開連接3.服務器做好斷開連接的準備后,給客戶端發送標志位FIN=1,ACK=1,seq=u,ack=x+1的報文告訴客戶端已做好準備斷開連接4.客戶端收到報文后,返回標志位ACK=1,seq=x+1,ack=u+1的報文表示收到消息并斷開連接

2.代碼分析:

在了解TCP的通信流程后,我們可以直接進行代碼分析:

代碼可以分為兩個部分:初始化和網絡連接過程

初始化過程主要做的事:stm32、spi、uart、w5500初始化過程。

網絡連接過程

Sn_SR狀態描述:
? ? ?? ?0x00?? ??? ?SOCK_CLOSED
? ? ?? ?0x13?? ??? ?SOCK_INIT
? ? ?? ?0x14?? ??? ?SOCK_LISTEN
? ? ?? ?0x17?? ??? ?SOCK_ESTABLISHED
? ? ?? ?0x1C?? ??? ?SOCK_CLOSE_WAIT
? ? ?? ?0x22?? ??? ?SOCK_UDP

????????我們不斷地去讀取狀態寄存器Sn_SR的值,根據這個值去執行不同的操作,首先我們的socket處于關閉狀態SOCK_CLOSED,執行socket()函數,打開socket,如果打開成功,Sn_SR寄存器會變為SOCK_INIT,然后執行conect()函數連接TCP服務端,連接成功后Sn_SR的值變為SOCK_ESTABLISHED,然后就可以進行數據傳輸測試。

int main(void)
{uint8 server_ip[4] = {192, 168, 10, 2};			// 配置遠程服務器IP地址uint16 server_port = 60000;								// 配置遠程服務器端口uint16 local_port = 2000;									// 初始化一個本地端口uint16 len = 0;/***** MCU時鐘初始化 *****/Systick_Init(72);/***** 中斷控制器配置 *****/NVIC_Configuration();/***** GPIO、SPI初始化 *****/GPIO_Configuration();WIZ_SPI_Init();/***** 串口初始化 *****/USART1_Init();/***** 初始化eeprom *****/at24c16_init();/***** 硬重啟W5500 *****/Reset_W5500();/***** W5500的IP信息初始化 *****/set_default(); 														// 設置默認MAC、IP、GW、SUB、DNSset_network();														// 配置初始化IP信息并打印,初始化8個Socket/***** 打開W5500的Keepalive功能 *****/setkeepalive(0);printf("TCP Server IP: %d.%d.%d.%d \r\n", server_ip[0], server_ip[1], server_ip[2], server_ip[3]);printf("TCP Server Port: %d \r\n", server_port);printf("W5500 Init Complete!\r\n");printf("Start TCP Client Test!\r\n");/*Socket狀態機,MCU通過讀Sn_SR(0)的值進行判斷Socket應該處于何種狀態Sn_SR狀態描述:0x00		SOCK_CLOSED0x13		SOCK_INIT0x14		SOCK_LISTEN0x17		SOCK_ESTABLISHED0x1C		SOCK_CLOSE_WAIT0x22		SOCK_UDP*/while(1)																				// Socket狀態機{switch(getSn_SR(0))														// 獲取socket0的狀態{case SOCK_INIT:															// Socket處于初始化完成(打開)狀態connect(0, server_ip, server_port);			// 配置Sn_CR為CONNECT,并向TCP服務器發出連接請求break;case SOCK_ESTABLISHED:											// Socket處于連接建立狀態if(getSn_IR(0) & Sn_IR_CON){setSn_IR(0, Sn_IR_CON);								// Sn_IR的CON位置1,通知W5500連接已建立}// 數據回環測試程序:數據從上位機服務器發給W5500,W5500接收到數據后再回給服務器len = getSn_RX_RSR(0);										// len=Socket0接收緩存中已接收和保存的數據大小if(len > 0){recv(0, buffer, len);										// W5500接收來自服務器的數據,并通過SPI發送給MCUprintf("%s\r\n", buffer);							// 串口打印接收到的數據send(0, buffer, len);										// 接收到數據后再回給服務器,完成數據回環}// W5500從串口發數據給客戶端程序,數據需以回車結束if(USART_RX_STA & 0x8000)								// 判斷串口數據是否接收完成,  USART_RX_STA:接收完成狀態標志位{len = USART_RX_STA & 0x3fff;						// 獲取串口接收到數據的長度send(0, USART_RX_BUF, len);							// W5500向客戶端發送數據USART_RX_STA = 0;												// 串口接收狀態標志位清0memset(USART_RX_BUF, 0, len + 1);					// 串口接收緩存清0}break;case SOCK_CLOSE_WAIT:												// Socket處于等待關閉狀態close(0);																// 關閉Socket0break;case SOCK_CLOSED:														// Socket處于關閉狀態socket(0, Sn_MR_TCP, local_port, Sn_MR_ND);		// 打開Socket0,并配置為TCP無延時模式,打開一個本地端口break;}}
}

3.測試:

在測試之前,我們要保證w5500配置的IP要和電腦以太網接口的IP在一個網段內。

我的是192.168.10.xxx網段。

上圖表示我們w5500已經成功連接我們的TCP_Server,并且可以進行數據傳輸。

02_W5500網絡初始化 <--------上一篇? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?下一篇--------> 04_W5500_TCP_Server

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/206979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/206979.shtml
英文地址,請注明出處:http://en.pswp.cn/news/206979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python游戲測試工具自動化遍歷游戲中所有關卡

場景 游戲里有很多關卡&#xff08;可能有幾百個了&#xff09;&#xff0c;理論上每次發布到外網前都要遍歷各關卡看看會不會有異常&#xff0c;上次就有玩家在打某個關卡時卡住不動了&#xff0c;如果每個關卡要人工遍歷這樣做會非常的耗時&#xff0c;所以考慮用自動化的方…

C語言第十六集(后續)(結構體)

1.匿名結構體(即不寫結構體名)只能用一次, 而且匿名結構體寫法特別危險 兩個匿名結構體盡管內容完全相同,但編譯器仍然認為二位是不相同的類型 結構的特殊聲明搜 2.結構體自己給自己里面包含一個結構體變量((此結構體就是當前所處的這個結構體))指針是沒有問題的,但是 結構…

AI專題報告:2022年中國人工智能產業研究報告

今天分享的AI系列深度研究報告&#xff1a;《AI專題報告&#xff1a;2022年中國人工智能產業研究報告》。 &#xff08;報告出品方&#xff1a;艾瑞咨詢&#xff09; 報告共計&#xff1a;112頁 人工智能參與社會建設的千行百業 價值性、通用性、效率化為產業發展戰略方向 …

淘寶API接口系列丨商品詳情數據接口丨關鍵詞搜索商品列表接口丨商品評論,銷量接口

要對接淘寶API接口&#xff0c;可以按照以下步驟進行操作&#xff1a; 注冊成為淘寶開放平臺開發者&#xff0c;并創建一個應用。在應用創建頁面&#xff0c;需要填寫應用的名稱、描述等信息&#xff0c;并設置應用的API權限等級。獲取App Key和App Secret。在應用創建后&…

淘寶商品詳情:獲取海量優質商品信息

淘寶商品詳情接口&#xff0c;也稱為淘寶商品詳情API&#xff0c;是一個用于獲取淘寶商品詳情的接口。它可以幫助開發者快速獲取淘寶商品信息&#xff0c;從而構建自己的電商應用程序。 在開始使用淘寶商品詳情接口之前&#xff0c;首先需要了解以下幾個概念和步驟&#xff1a…

jira創建用例,與任務關聯

項目用的jira&#xff0c;但之前的用例放在禪道上&#xff0c;或者歸檔于svn&#xff0c;都不是很好用&#xff0c;所以研究了下jira的用法 1、下載插件&#xff1a; synapseRT - Test management and QA in JIRA 完成后在tab會多出一個test 2、常用的功能 1、建立用例&#…

【華為OD題庫-081】最長的元音子串長度-Java

題目 題目描述: 定義當一個字符串只有元音字母一(a,e,i,o,u,A,E,l,O,U)組成&#xff0c; 稱為元音字符串&#xff0c;現給定一個字符串&#xff0c;請找出其中最長的元音字符串&#xff0c;并返回其長度&#xff0c;如果找不到請返回0&#xff0c; 字符串中任意一個連續字符組成…

Gitlab+GitlabRunner搭建CICD自動化流水線將應用部署上Kubernetes

文章目錄 安裝Gitlab服務器準備安裝版本安裝依賴和暴露端口安裝Gitlab修改Gitlab配置文件訪問Gitlab 安裝Gitlab Runner服務器準備安裝版本安裝依賴安裝Gitlab Runner安裝打包工具安裝docker安裝java17安裝maven 注冊Gitlab Runner 搭建自動化部署準備SpringBoot項目添加一個Co…

驗證碼的多種生成策略

&#x1f60a; 作者&#xff1a; 瓶蓋子io &#x1f496; 主頁&#xff1a; 瓶蓋子io-CSDN博客 第一種 a.導入依賴 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

【數據結構】字典樹(Trie樹)算法總結

知識概覽 Trie&#xff1a;高效地存儲和查找字符串集合的數據結構數字、漢字可以用二進制位來存 例題展示 題目鏈接 Trie字符串統計&#xff1a; https://www.acwing.com/problem/content/837/ 代碼 #include <cstdio>const int N 100010;int son[N][26], cnt[N],…

zxjy003- Spring Cloud后端工程搭建

1、創建 sprigboot 工程 guli-parent groupId &#xff1a; com.atguigu artifactId &#xff1a; guli-parent 2.刪除src目錄 3.配置pom.xml 修改版本為 &#xff1a;2.2.1.RELEASE<artifactId> 節點后面添加 pom類型 全部依賴&#xff0c;復制下面的即可&#xff0c…

素材創作平臺,解決企業素材供給問題

企業對于高質量素材的需求日益增長。無論是為了提升品牌形象&#xff0c;還是為了推動產品銷售&#xff0c;都需要大量的專業設計素材。然而&#xff0c;素材的獲取、設計和定制往往是一項耗時耗力的工作。這時&#xff0c;美攝科技素材創作平臺應運而生&#xff0c;為企業提供…

LeetCode [中等]矩陣置零

73. 矩陣置零 - 力扣&#xff08;LeetCode&#xff09; 暴力解法 用兩個標記數組分別記錄每一行和每一列是否有零出現。 遍歷該數組一次&#xff0c;如果某個元素為 0&#xff0c;那么就將該元素所在的行和列所對應標記數組的位置置為 true。再次遍歷該數組&#xff0c;用標…

從0到1,手把手帶你開發截圖工具ScreenCap------001實現基本的截圖功能

ScreenCap---Version&#xff1a;001 說明 從0到1&#xff0c;手把手帶你開發windows端的截屏軟件ScreenCap 當前版本&#xff1a;ScreenCap---001 支持全屏截圖 支持鼠標拖動截圖區域 支持拖拽截圖 支持保存全屏截圖 支持另存截圖到其他位置 GitHub 倉庫master下的Scr…

人工智能技術在數據治理中的一些思考

隨著企業信息化系統的快速建設&#xff0c;以及物聯網的規模化的應用&#xff0c;企業數據規模快速增長&#xff0c;與之同時企業數據的治理模式仍然以傳統的治理方式為主&#xff0c;ChatGPT等人工智能的崛起正深刻改變著數據治理的思路&#xff0c;如何將AI技術引入企業數據治…

C++新經典模板與泛型編程:用成員函數重載實現std::is_convertible

用成員函數重載實現is_convertible C標準庫中提供的可變參類模板std::is_convertible&#xff0c;這個類模板的主要能力是判斷能否從某個類型隱式地轉換到另一個類型&#xff0c;返回的是一個布爾值true或false。例如&#xff0c;一般的從int轉換成float或從float轉換成int&am…

使用Plex結合cpolar搭建本地私人媒體站并實現遠程訪問

文章目錄 1.前言2. Plex網站搭建2.1 Plex下載和安裝2.2 Plex網頁測試2.3 cpolar的安裝和注冊 3. 本地網頁發布3.1 Cpolar云端設置3.2 Cpolar本地設置 4. 公網訪問測試5. 結語 1.前言 用手機或者平板電腦看視頻&#xff0c;已經算是生活中稀松平常的場景了&#xff0c;特別是各…

劇本殺小程序搭建:打造線上劇本殺新體驗

劇本殺是一款以角色扮演為主的游戲&#xff0c;一度成為了年輕人的最喜愛的社交游戲。在劇本殺市場需求下&#xff0c;劇本殺規模也迅速上升。今年第一季度&#xff0c;劇本殺市場規模環比增長47%&#xff0c;市場整體消費水平逐漸呈上升趨勢。 隨著劇本殺的不斷發展&#xff…

echarts繪制一個環形圖2

其他echarts&#xff1a; echarts繪制一個環形圖 echarts繪制一個柱狀圖&#xff0c;柱狀折線圖 echarts繪制一個餅圖 效果&#xff1a; 組件代碼&#xff1a; <template><div class"wrapper"><div ref"doughnutChart2" id"dough…

ORACLE數據庫實驗總集 實驗六 SQL 語句應用

一、 實驗目的 &#xff08;1&#xff09; 掌握數據的插入&#xff08;INSERT&#xff09;、 修改&#xff08;UPDATE&#xff09; 和刪除&#xff08;DELETE&#xff09; 操作。 &#xff08;2&#xff09; 掌握不同類型的數據查詢&#xff08;SELECT&#xff09; 操作。 二、…