TCP/IP協(xié)議在VRS51單片機上的實現(xiàn)
ICMP(Internet控制報文協(xié)議)用來傳遞差錯報文以及其他需要注意的信息。uIP只實現(xiàn)了echo。
ARP(Address Resolution Protocol)為IP地址到對應(yīng)的硬件地址之間提供動態(tài)映射。ARP協(xié)議是把目標(biāo)IP地址解析為以太網(wǎng)MAC地址,當(dāng)一個IP包要在以太網(wǎng)上發(fā)送時,先查詢ARP表,找出要發(fā)送的MAC地址。如果在表里找不到對應(yīng)的IP地址,就會廣播ARP請求包,以獲取給出IP地址所對應(yīng)的MAC地址。目的主機收到請求包后發(fā)出一個ARP回應(yīng)包,給出自己的MAC地址和IP地址。ARP表每十秒更新一次。ARP協(xié)議是uIP的可選模塊。
UDP(User Datagram Protocol)協(xié)議是一個簡單的、面向數(shù)據(jù)報的傳輸層協(xié)議。UDP協(xié)議是uIP可選模塊。
uIP是一個專為8位和16位單片機設(shè)計的小型簡易的TCP/IP協(xié)議棧,簡單易用、占用資源少是其設(shè)計特點。為了占用較少的資源,uIP只保留了基本的通信功能而把全功能協(xié)議棧中那些不常用的功能去掉,其重點是在IP、TCP和ICMP的實現(xiàn)上,而把ARP和UDP作為可選模塊。
uIP處于網(wǎng)絡(luò)通信的中間,其上層協(xié)議是應(yīng)用程序?qū)?,其下層硬件或固件稱為網(wǎng)絡(luò)設(shè)備驅(qū)動層。uIP并不僅僅是為以太網(wǎng)設(shè)計的,它與媒體無關(guān)。
uIP的設(shè)備驅(qū)動程序接口
uIP中需要底層驅(qū)動支持的函數(shù)有:uip_input( )和uip_periodic( )。uip_input( )函數(shù)是用來處理網(wǎng)絡(luò)層和設(shè)備驅(qū)動層之間的傳送數(shù)據(jù)的,當(dāng)設(shè)備驅(qū)動程序從網(wǎng)絡(luò)層收到一個數(shù)據(jù)包時會調(diào)用此函數(shù),設(shè)備驅(qū)動程序會事先把數(shù)據(jù)包存放在uip_buf[ ]緩沖區(qū)里,而把數(shù)據(jù)長度放到uip_len,然后交給uip_input( )函數(shù)處理。當(dāng)函數(shù)返回時,如果uip_len不為0,則表明帶有數(shù)據(jù)。如果需要ARP支持時,則要考慮更新ARP 表或者發(fā)送ARP請求和回應(yīng)。
uip_periodic( )用于內(nèi)部時鐘事件計時,當(dāng)周期定時激發(fā)時,每一個 TCP連接應(yīng)該調(diào)用uip_periodic( )函數(shù)。這個函數(shù)用于uIP內(nèi)核對各連接的定時輪循,因此需要一個硬件支持的定時程序周期性地用它輪循各連接,一般用于檢查主機是否有數(shù)據(jù)要發(fā)送,如果需要則構(gòu)造IP包。
從本質(zhì)上來說,uip_input( )和uip_periodic( )在內(nèi)部是一個函數(shù),即uip_process ( )。UIP的設(shè)計者將uip_process(UIP_DATA)定義成uip_input( ),而將uip_process(UIP_TIMER)定義成uip_periodic( ),因此從代碼實現(xiàn)上來說是完全復(fù)用的。
uIP應(yīng)用程序接口
uIP在接受到底層傳來的數(shù)據(jù)包后,如需送上層應(yīng)用程序處理,就會調(diào)UIP_APPCALL( ),同時uIP設(shè)置UIP_CONN結(jié)構(gòu)體指針指向當(dāng)前連接。UIP_CONN記錄一條TCP連接的所有相關(guān)信息。為了將用戶的應(yīng)用程序掛接到uIP中,必須將宏UIP_APPCALL( )定義成實際的應(yīng)用程序函數(shù)名,這樣每當(dāng)某個uIP事件發(fā)生時,內(nèi)核就會調(diào)用該應(yīng)用程序進(jìn)行處理。如果要加入應(yīng)用程序狀態(tài)的話,必須將宏UIP_APPSTATE_SIZE定義成應(yīng)用程序狀態(tài)結(jié)構(gòu)體的長度。
uIP在VRS51L3074上的應(yīng)用和簡單Socket通信
本硬件平臺是網(wǎng)絡(luò)POS機的一部分,它的工作原理是:由掃描槍采集的數(shù)據(jù)經(jīng)串口送入網(wǎng)卡內(nèi),然后經(jīng)網(wǎng)絡(luò)發(fā)送到遠(yuǎn)端主機。
本系統(tǒng)的軟件部分包括網(wǎng)絡(luò)設(shè)備驅(qū)動程序、TCP/IP協(xié)議棧實現(xiàn)以及簡單的Socket通信程序。
CS8900主要包括三個部分:EtherDevInit()函數(shù)完成CS8900A網(wǎng)絡(luò)芯片的初始化,包括初始化寄存器等,使之進(jìn)入服務(wù)狀態(tài);EtherDevSend()實現(xiàn)把以太網(wǎng)數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)中;EtherDevRecv()完成數(shù)據(jù)的接受。在CS8900的頭文件中設(shè)置了MAC地址以及其他的一些參數(shù)。
網(wǎng)絡(luò)設(shè)備驅(qū)動程序通過兩個全局變量與uIP協(xié)議棧進(jìn)行接口:uip_buf為收發(fā)緩沖區(qū),uip_len為數(shù)據(jù)的長度。EtherDevSend( )函數(shù)把uip_buf里的數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中,EtherDevRecv( )函數(shù)把接受到的數(shù)據(jù)存儲到uip_buf緩沖區(qū)中,同時修改uip_len的值。
uIP協(xié)議棧承擔(dān)網(wǎng)絡(luò)通信功能,一方面與底層鏈路層通信實現(xiàn)數(shù)據(jù)收發(fā),另一方面為上層應(yīng)用程序提供了簡單的API接口。uIP基本實現(xiàn)了IP、TCP、ARP、UDP以及ICMP(ping)等協(xié)議,它包括uip.c、uip_arch.c、uip_arp.c、uip.h、uipopt.h、uip_arch.h、uip_arp.h等文件。uip.c完成主要TCP/IP功能,主要是IP和TCP協(xié)議,UDP是可選模塊;uip_arp.c完成地址解析;uip_arch.c完成校驗;uipopt.h是uIP配置文件,它以宏的形式定義便于修改,用戶可根據(jù)自己的需要設(shè)置本地的物理地址、IP地址、網(wǎng)關(guān)地址、收發(fā)緩沖區(qū)大小、支持的最大連接數(shù)以及ARP表大小等選項。
VRS51L3074有3個16-bit的定時器,可以選擇一個為TCP/IP協(xié)議中與事件有關(guān)的事件定時。uIP中需要定時的事件有:為uip_periodic( )函數(shù)的執(zhí)行提供基準(zhǔn)和ARP表更新。uip_periodic( )函數(shù)每0.5秒執(zhí)行一次,ARP表每10秒更新一次。
添加了必需的模塊,進(jìn)行了正確的配置后,需要編寫主程序和應(yīng)用程序初始化包括定時器初始化、串口初始化、網(wǎng)卡芯片初始化、uIP協(xié)議棧初始化、用戶應(yīng)用程序初始化等,主程序初始化完成后,進(jìn)入不停查詢的狀態(tài),如果有數(shù)據(jù)到來,則交給uip_input( )進(jìn)行處理,如果沒有則由uip_periodic( )來處理定時事件。為了將應(yīng)用程序掛接到uIP中,必須把UIP_APPCALL( )定義為實際的應(yīng)用 程序函數(shù)名,這樣每當(dāng)某個uIP事件發(fā)生時,內(nèi)核就會調(diào)用該應(yīng)用程序進(jìn)行處理。本應(yīng)用程序定義 #define UIP_APPCALL socket_appcall。
結(jié)束語
本方案成功地把嵌入式TCP/IP協(xié)議棧uIP移植到VRS51單片機上,實現(xiàn)了網(wǎng)絡(luò)通信。該方案是網(wǎng)絡(luò)POS機的一部分,目前已經(jīng)正在運行,且狀態(tài)良好。本方案采用的單片機和網(wǎng)絡(luò)芯片不但性能良好而且價格低廉,uIP是一個性能優(yōu)良的免費小型TCP/IP協(xié)議棧,因此本系統(tǒng)運行速度快、穩(wěn)定可靠且價位較低。本方案可廣泛應(yīng)用于遠(yuǎn)程數(shù)據(jù)采集、傳輸,遠(yuǎn)程監(jiān)控,遠(yuǎn)程抄表以及 信息家電等領(lǐng)域。
51單片機相關(guān)文章:51單片機教程
tcp/ip相關(guān)文章:tcp/ip是什么
pos機相關(guān)文章:pos機原理
評論