單片機TCP/IP

單片機TCP/IP

單片機TCP/IP就是在單片機上運行的TCP/IP協定棧。由於嵌入式聯網設備越來越多,需要在嵌入式設備上實現TCP/IP協定棧,但是嵌入式設備不同於PC機,它們一般採用MCU也就是單片機而不是CPU作為核心處理器。這就需要在單片機上實現TCP/IP協定棧。對於高端的32位單片機,由於其性能已經接近於低端PC機CPU(例如奔騰II系列),所以和在PC上實現TCP/IP協定棧沒有多大區別;這裡主要講述低端8位(例如51單片機)、16位單片機TCP/IP協定棧。

基本介紹

  • 中文名:單片機TCP/IP
  • 外文名:danpianjiTCP/IP
  • 特點: 程式存儲空間和外部RAM空間不大
  • 特點: 速度慢
  • 協定棧: eCos單片機TCP/IP協定棧
  • 協定棧: ZLIP 51單片機TCP/IP協定棧
單片機TCP/IP的特點,已有的單片機TCP/IP協定棧,如何使用單片機TCP/IP協定棧,

單片機TCP/IP的特點

在單片機上實現TCP/IP與在PC機上實現TCP/IP是有所不同的,參考《TCP/IP在51單片機上的實現特點和方法》我們可以了解到,它的特點是:
1. 速度慢:根據該文檔的介紹12M晶振51單片機的最快網路傳送速度為25KB/s。其中的關鍵在於TCP/IP需要對傳送的每個位元組進行校驗和計算,以及必要的拷貝。這樣51單片機的處理速度就不夠了。為了提高單片機TCP/IP的速度一般的方法是要對協定棧進行精簡。
2. 程式存儲空間和外部RAM空間不大:一般的單片機的最大程式和數據空間為64KB。TCP/IP協定一般需要對傳送的數據進行快取,而一個最大的數據包就有1500B左右,當網路速度很大的時候記憶體消耗將很大。對於非嵌入式TCP/IP協定棧,64KB的程式和數據空間是不夠的。
3. 單片機體系結構:51單片機是8位機,所以對於需要完成同一個數據操作,32位的PC機可能只需要10條指令,而51單片機可能需要幾百條指令。

已有的單片機TCP/IP協定棧

由於TCP協定棧的程式流程較為複雜,因為程式中需要處理對方傳送過來的數據、發起的連線,而我方並不知道對方會何時進行什麼樣的操作,這就使得協定處理起來較為複雜。另外一個原因是單片機TCP/IP協定棧的穩定性是以非常重要的問題,一個穩定的協定棧需要在實際套用中經過長時間的測試,所以編寫一個穩定的單片機TCP/IP協定棧更加困難。為此另外一種選擇就是使用現有的TCP/IP協定棧。
1. eCos單片機TCP/IP協定棧:eCos TCP/IP棧是涉及與eCos作業系統/核心一起運行的。eCos(和TCP/IP棧)由大量處理其結構支持。eCos TCP/IP棧當前發布了一個測試版,作為一個單獨的模組。
2. ZLIP 51單片機TCP/IP協定棧:ZLIP是專門為51單片機設計的嵌入式TCP/IP協定棧,可以在有作業系統和沒有作業系統情況下運行,具有代碼量適中、運行速度快、用戶接口簡單、兼容BSD socket接口的特點。實現了TCPUDPICMPARP協定,ZLWeb實現了HTTP協定。支持多TCP連線、多UDP連線同時運行,支持在uc/os-II作業系統下多任務運行數據收發。可以用於51單片機TCP/IP上網解決方案。
3. uc/ip 單片機TCP/IP協定棧:uC/IP(mew-kip)是為為控制其設計的一個TCP/IP協定棧。代碼基於BSD(很像所有其它棧)但對非常小的覆蓋範圍功能有所減少。它當前為Linux和DOS目標而建。
4. BSD 單片機TCP/IP協定棧:BSD棧歷史上是其他商業棧的開始點,大多數專業TCP/IP棧(如帶Wind-River VxWorks核心的)是BSD棧派生的。這是因為BSD在BSD許可協定下提供了他們的棧,它們的許用證使你能以修改或未修改的形式結合它們的代碼而無須向創建者付版稅。與GPL許用證相比,如果你結合GPL原始碼,後者要求你的GPL中公開你的原始碼。
5. lwIP 單片機TCP/IP協定棧:lwIP(輕型)TCP/IP棧是TCP/IP協定棧的一個小型實現。它包括帶IP和ICMP的TCP和UDP傳輸層。還提供一個可選的BSD套接字API。為了性能,還包括一個零拷貝API。LwIP協定棧是為嵌入式系統設計的並能適合40KB的ROM和幾百位元組的RAM。為了可移植性它用C編寫。
6. uIP 單片機TCP/IP協定棧:uIP是專門為8位和16單片機設計的一個非常小的TCP/IP協定棧。uIP完全用C編寫,以此可以移植到各種不同的結構和作業系統上。一個編譯的棧可以有幾KB ROM或幾百位元組RAM中運行。uIP還包括一個HTTP伺服器作為服務內容。
7. TinyTCP 單片機TCP/IP協定棧:TinyTCP棧是TCP/IP的一個非常小的簡單的實現,它包括一個FTP客戶。TinyTCP是為燒入ROM設計的並且對大端結構似乎是有用的(初始目標是68000晶片)。TinyTCP也包括一個簡單的乙太網驅動器用於3Com多匯流排卡。
8. WATTCP 單片機TCP/IP協定棧:WATTCP是為嵌入基於DOS的系統而設計的一個小型TCP/IP棧。它包括一個Real Mode DOS版本和另一個32位擴展環境版本。

如何使用單片機TCP/IP協定棧

用戶在拿到一個單片機TCP/IP協定棧以後該如何處理呢。其中的處理分為兩個部分:上層接口和下層接口。
4. 1 上層接口
用戶使用單片機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就接收到了當前的遠程溫度數據。
4. 1 下層接口
下層接口是一個比較複雜的部分,實際上是TCP/IP協定棧和底層硬體的對接問題。如果用戶將TCP/IP協定棧移植到自己的單片機系統上。由於硬體上存在一定的差異,就需要修改底層代碼。這裡需要包括:
1.網卡驅動:如果TCP/IP協定棧已經提供了網卡驅動,並且驅動和用戶使用的網卡晶片一樣,那么就相對容易一些。這裡只需要修改網卡的基地址即可。否則需要自己動手寫驅動程式。如果網卡採用RTL8019AS可以參考老古開發網的單片機與TCP/IP網路。如果網卡採用CS8900,可以參考《嵌入式 TCP/IP 協定單片機技術在網路通信中的套用》
2.TCP/IP底層接口。一般單片機TCP/IP需要底層為其提供定時中斷、網卡中斷處理的入口。底層需要做相應的處理。

相關詞條

熱門詞條

聯絡我們