單片機TCP IP協議棧的實現步驟
前面我們在《單片機TCP IP協議棧實現的原理》一文中為大家介紹了相關的原理和知識。現在為了能更好地方便大家實現這個協議,我們將具體的一些步驟和函數給展現出來。希望對大家有用。那么如何使用單片機TCP IP協議棧呢?用戶在拿到一個單片機TCP IP協議棧以后該如何處理呢?其中的處理分為兩個部分:上層接口和下層接口。
◆上層接口
用戶使用單片機TCP/IP的目的實際非常明了,就是要實現數據的傳送,即從PC機(或者另一個單片機)上傳送過來的數據能夠在本地單片機上接收,反之亦然。所以如果屏蔽底層的話,單片機TCP IP協議棧就是一個傳輸數據的手段。所以最后歸結到了使用send()、recv()函數即可。這就是使用單片機TCP IP協議棧的核心所在。 但是事實上并沒有這么簡單,因為對于TCP需要有發起連接、接受連接、發送數據、接收數據、關閉連接等操作以配合數據的傳輸。TCP IP協議棧一般為用戶提供如下的接口:
1. 初始化協議棧和釋放協議棧的函數接口,類似Init(), Release()之類的函數。
2. 提供類似BSD socket的socket, sendto, recvfro, connect, bind, listen, accept, send, recv, closesocket, shutdown, getpeername, getsockname, htonl, htons, ntohl, ntohs, inet_addr,inet_ntoa,ioctlsocket,setsockopt, getsockopt,select等API函數,用戶調用此類函數進行發起連接、接受連接、發送數據、接收數據、關閉連接等操作。
3. 接受連接、接收數據、被動關閉的處理:由于此類操作是上位機發起的,所以TCP IP協議棧必須提供一套機制來處理此類事件的發生。
一般來說有兩種方法:
a) 主動等待:例如使用BSD的recv()函數等待數據的到來。
b) 回調機制:采用類似MFC的OnReceive()函數的回調機制,也即是說在接收到數據的時候會自動調用OnReceive()函數。
那么用戶如何使用以上的接口來實現遠程控制、遠程數據采集呢?方法很簡單。
例如現在需要實現一個對LED燈的亮和滅的遠程控制應用。首先PC機使用TCP/IP發送工具例如SocketDlgTest程序發送一個字節的“1"到開發板(根據開發板的IP地址發送)。開發板在OnReceive函數中發現收到的是“1",那么就通過P1端口將燈打開;反之如果收到的是“0"則將燈熄滅。
如果是實現一個遠程數據采集的應用,例如定時進行溫度采集。首先PC機使用SocketDlgTest程序等待發來數據。開發板每隔一段時間采集一個數據,然后通過send()函數將數據發送給PC機(根據PC機的IP地址發送),這樣PC就接收到了當前的遠程溫度數據。
◆下層接口
下層接口是一個比較復雜的部分,實際上是TCP IP協議棧和底層硬件的對接問題。如果用戶將TCP IP協議棧移植到自己的單片機系統上。由于硬件上存在一定的差異,就需要修改底層代碼。這里需要包括:
1.網卡驅動:如果TCP IP協議棧已經提供了網卡驅動,并且驅動和用戶使用的網卡芯片一樣,那么就相對容易一些。這里只需要修改網卡的基地址即可。否則需要自己動手寫驅動程序。如果網卡采用RTL8019AS可以參考老古開發網的單片機與TCP/IP網絡。
2.TCP/IP底層接口。一般單片機TCP/IP需要底層為其提供定時中斷、網卡中斷處理的入口。底層需要做相應的處理。