今天給大家介紹的是以太網控制網絡單片機W7100A的應用筆記之如何實現TCP通信。
TCP(傳輸控制協議)是用于控制網絡間數據通信的協議。作為組成互聯網的主要協議之一,更多的詳細內容已經寫入IETF(互聯網工程任務組)的RFC 793中。TCP是運行于IP層上的協議,它保證了數據的有效傳輸并且可以按照數據的發送順序依次進行接收。
因為W7100A單片機支持傳輸層的TCP協議,所以用戶不需要做任何整合就可以直接使用TCP/IP協議。
下面一一給大家做闡述。
1 TCP SOCKET
用戶可以在W7100A提供的所有8個SOCKET中使用TCP協議,但是必須首先創建要使用的SOCKET。在創建SOCKET時,需要用到SOCKET號、協議、端口號以及標志位。這篇文檔將會介紹什么是TCP協議,以及在使用TCP協議時如何將Sn_MR(TCPIP核心中的SOCKET n模式寄存器)設置為Sn_MR_TCP(0×01)。SOCKET號表示用戶可以選擇從0到7這8個SOCKET中的任意一個使用。端口號表示TCP協議下用戶指定使用的端口。如果上面需要的這些都已經設定好,那么socket()函數就可以自行分配創建一個SOCKET。
由于W7100A單片機的TCP協議支持服務器模式和客戶端模式,用戶可以任意選擇一個模式實現此應用。服務器模式和客戶端模式的不同見下圖:
<圖1.1> TCP 服務器和TCP 客戶端
如圖1.1所示,TCP服務器模式和客戶端模式的過程大致相同。唯一的區別在于打開SOCKET之后,SOCKET狀態是監聽還是連接。當TCP協議在服務器模式下運行時,服務器處于監聽狀態等待來自客戶端的連接請求。如果TCP協議運行于客戶端模式下,客戶端將會在連接狀態下請求連接服務器。一旦成功建立連接,SOCKET的狀態將會變成建立(SOCK_ESTABLISHED,0×17)。SOCKET在點對點建立連接之后仍然可以保持連接狀態,從而進行數據交換直到SOCKET關閉。
服務器模式下的SOCKET循環周期是由打開、監聽、發送、接收、斷開和關閉組成。客戶端模式的SOCKET循環周期則是由打開、連接、發送、接收、斷開和關閉組成。
1.1 打開(OPEN)
無論是在服務器模式或是客戶端模式下,在創建SOCKET時第一步都是打開SOCKET。利用SOCKET()函數設置SOCKET號、協議、端口號以及標志位來創建一個SOCKETn(取第n-1個SOCKET值)。由于使用的是TCP協議,需要將協議設置為Sn_MR_TCP(0×01)。而端口號的設置則取決于是在服務器模式還是客戶端模式下。如果是在服務器模式下,服務器會根據當前用戶所使用的端口來設置源端口號。但是如果是在客戶端模式下,因為目的端口號正在被使用,最好隨機選擇一個端口號,并每次增加一個數字,直到SOCKET被連接為止。TCP協議的標志位表示‘無延時確認標志位’,一般來說,將該位設置為0。更多關于協議類型、標志位等信息,將會在‘TCPIPCore.h’文件下的‘Sn_MR value’中介紹。
在所有的設置完成之后,通過檢查Sn_SR(n)寄存器來查看SOCKETn的狀態是否變成SOCK_INIT(0×13)。用戶可以通過getSn_SR(SOCKETn)函數來完成Sn_SR(N)寄存器的檢查過程。如果SOCKET的狀態為SOCK_INIT(0×13),表示SOCKET創建成功;如果沒有成功,用戶需要重新創建SOCKET。
例1.1 打開SOCKET
1.2 監聽(LISTEN)
監聽過程只能在服務器模式下使用。在SOCKETn創建完成后,為了能與客戶端連接,需要將SOCKET的狀態從SOCK_INIT(0×13)變成監聽。用戶可以直接將Sn_CR(n)寄存器設置為Sn_CR_LISTEN(0×02)或者可以直接使用’SOCKET.c’文件中的LISTEN()函數。在變成監聽狀態之后,SOCKET將會改變為SOCK_LISTEN(0×14)。然后,SOCKET等待客戶端發出連接請求。一旦與客戶端建立連接,SOCKET的狀態將會重新變成SOCK_ESTABLISHED(0×17)。此時,便可以與客戶端之間進行數據傳輸。
例 1.2 設置監聽狀態
1.3 連接(CONNECT)
連接過程發生在客戶端模式連接到服務器時。在連接SOCKET時需要用到SOCKET號、目的IP以及目的端口號這些參數。用戶可以通過CONNECT()函數進行設置;一旦成功建立連接,SOCKET的狀態將會變成SOCK_ESTABLISHED(0×17)。
例 1.3 設置連接狀態
1.4 發送(SEND)
在使用TCP協議時,與對端的連接在發送數據前就已經完成。用戶可以通過SEND()函數查看設置的SOCKET號、將要發送數據的地址、數據的大小等參數。將要發送的數據的地址通常由選擇的區域確定,輸入數據,并且通過指針設定區域。
例1.4 發送數據
1.5 接收(RECEIVE)
接收過程和發送過程基本相同,唯一不同的是接收(RECEIVE)過程需要檢查的是Sn_RX_RSR(n)。接收過程是指將來自接收緩存器的數據移動到用戶數據存儲區。因此,用戶必須在接收之前檢查Sn_RX_RSR(n)的值是否大于0。如果大于0,表示數據已經保存在接收緩存器中。用戶必須通過getSn_RX_RSR(n)函數在此過程之前確認數據是否被接收。
例1.5 接收數據
1.6 斷開(DISCONNECT)
關閉SOCKET的方法通常有兩種:第一種方法是通過DISCONNECT(n)函數。DISCONNECT(n)函數不能用來直接關閉SOCKET。它先向對端發送斷開連接請求(FIN數據包),然后等待回復信息(FIN/ACK數據包),之后才能將SOCKET的狀態變成SOCK_CLOSED(0×00),最后關閉SOCKET。當收到斷開連接請求時,W7100A發送一個FIN/ACK數據包表示允許對端關閉SOCKET。如果在發送斷開連接請求之后沒有收到對端的回復,將會發生TCP超時,SOCKET的狀態將會變成SOCKET_CLOSED(0×00)。當用戶需要斷開連接時,通過DISCONNECT()函數,選擇合適的SOCKET號,然后發送斷開連接請求。
例1.6 設置斷開連接
1.7 關閉(CLOSE)
和斷開的過程不同,關閉過程可以直接將SOCKET變成SOCK_CLOSED(0×00)。用戶通過
CLOSE(n)函數選擇合適的端口號,然后無論對端有沒有做出響應都將關閉SOCKET。如果RST數據包來自對端,SOCKET將會無條件變成SOCK_CLOSED(0×00)。一旦SOCKET變成為SOCK_CLOSED(0X00), SOCKET將不再可用除非重新打開它。
例1.7 設置關閉
2? TCP回路測試(LOOPBACK)
2.1 服務器模式
TCP回路測試可以通過回送來自于對端的數據從而檢測TCP協議的性能。這一章節將會介紹服務器模式下回路測試的例子。程序范例如下:
例2.1 設置回路測試(LOOPBACK)服務器
如上面的例子所示,在SOCKET循環周期內除了connect()函數,其他所有函數都可以使用。首先利用getSn_SR(s)函數檢測SOCKET狀態,在W7100A復位后,所有的SOCKET全都變成SOCK_CLOSED(0×00)狀態。然后利用close()函數完全關閉SOCKET,再通過socket(s,Sn_MR_TCP,port,0×00)函數來創建一個新的SOCKET。如果SOCKET創建成功,狀態將會變成SOCK_INIT,再通過listen(s)函數將SOCKET的狀態變成監聽。一旦與對端建立連接,SOCKET的狀態將變成SOCK_ESTABLISHED,并且等待數據。所有接收到的數據都保存在接收緩存器中,recv(s,data_buf,len)函數中的data_buf變量定義為接收到的數據的長度。最后再通過send(s,data,len)函數將數據回送到客戶端。客戶端會比較數據交換前后的差異來檢測數據通信是否正常。
2.2 客戶端模式
本章節將會介紹客戶端模式下回路測試的例子。程序范例如下:
例2.2 設置回路測試(LOOPBACK)客戶端
TCP客戶端的程序例子和TCP服務器的例子基本相同。唯一的區別在于SOCK_INIT狀態下,是通過connect()函數而不是listen()函數與服務器連接。
3 回路測試服務器演示
這一章將會介紹TCP回路測試程序運行的例子。在下載完成TCP回路測試應用的二進制文件后,運行iMCUW7100單片機內的數據包實現回路測試的演示過程。更多的詳細信息,請參閱文檔‘如何在W7100A中創建工程’,‘WizISP程序指南’以及‘W7100A Debugger指南’。
對TCP串行回路,用戶按照下面的步驟進行設定:
● 確認測試環境。請參考‘iMCU7100EVB用戶指南’
直接利用UTP線連接PC機與iMCU7100EVB
直接利用串口線連接PC機與iMCU7100EVB
使能iMCU7100EVB的5V電源適配器
● 添加下面測試PC機的網絡信息
- IP地址 : 192.168.1.xxx (‘xxx’ 為用戶PC機的IP地址,在客戶端模式下此IP地址 也是服務器的IP地址,即我們之前在TCP客戶端代碼中設置在destip[4]的IP地址)。 在本文檔中,IP設置為192.168.1.69,但是用戶可以進行修改。
- 網關IP地址 : 192.168.1.1
- 子網掩碼 : 255.255.255.0
● 運行超級終端機程序以及AX1程序
3.1 超級終端機程序
<圖3.1> 超級終端機程序選項
在超級終端機程序行完成之后,如圖4.1設置串行通信的選項。超級終端機程序將會顯示串行通信時iMCU7100EVB的運行狀態。
3.2 AX1 設置
想了解更多關于AX1程序的信息,請參考AX1用戶手冊。
3.2.1 TCP服務器模式下的iMCU7100EVB
當iMCU7100EVB運行于服務器模式時,PC作為TCP客戶端利用AX1程序連接到iMCU7100EVB。在AX1程序中,選擇TCP => CONNECT 菜單來實現與iMCU7100EVB的連接,此時對端的IP地址為192.168.1.2,端口號為5000。
一旦連接成功,如圖4.2選擇TCP => SEND 菜單發送數據。因為此時iMCU7100EVB作為服務器,AX1程序窗口將會顯示客戶端的狀態。
<圖3.2> AX1 發送數據
3.2.2 TCP客戶端模式下的iMCU7100EVB
當iMCUW7100EVB運行于客戶端模式下時,PC機作為TCP服務器使用AX1程序將iMCU7100EVB連接到服務器端口。如果在AX1程序中打開的服務器端口號是5000(監聽狀態),iMCU7100EVB將會連接到服務器IP地址以及服務器端口(192.168.1.xxx,5000)。需要注意的是IP地址必須是打開AX1程序的PC機上的IP地址。
一旦連接成功,選擇TCP =>SEND菜單, 然后發送數據,如圖4.2。因為iMCU7100EVB作為客戶端,AX1程序窗口將會顯示服務器的狀態。
<圖3.3> AX1監聽
3.3 TCP回路測試結果
3.3.1 TCP服務器結果
在設置完成TCP服務器之后,點擊TCP發送。然后AX1程序將會顯示PC機客戶端的處理進程。如圖4.4所示,圖中顯示了發送/接收的數據大小,而超級終端機程序將會顯示iMCU7100EVB服務器的處理情況。
<圖3.4> TCP服務器的結果
3.3.2 TCP客戶端結果
在TCP客戶端所有的設置完成后,點擊TCP發送。AX1將會顯示PC機服務器的處理情況。如圖4.5所示,圖中顯示了發送/接收數據的大小,而超級終端機程序將會顯示iMCU7100EVB客戶端的處理情況。
<圖3.5> TCP客戶端結果
評論
查看更多