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