四軸飛行器wifi開發(fā)板及其lwip編程指南_第1頁
四軸飛行器wifi開發(fā)板及其lwip編程指南_第2頁
四軸飛行器wifi開發(fā)板及其lwip編程指南_第3頁
四軸飛行器wifi開發(fā)板及其lwip編程指南_第4頁
四軸飛行器wifi開發(fā)板及其lwip編程指南_第5頁
免費預覽已結(jié)束,剩余27頁可下載查看

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

TCP/IP協(xié)議棧應

LwIP接口及編程指LwIP,RAW摘LwIP在無操作系統(tǒng)支持環(huán)境下的API函數(shù)介紹及編程應用。首先,介紹了RAWAPI的特點及優(yōu)缺點,然后逐個介紹了LwIP提供的所有的RAWAPI函數(shù),修訂歷修改了UDP服務器的程序。因為作為服務器的主機并不一定參數(shù)中獲取了客戶機的IP地址及端等信息。銷售與服務網(wǎng)絡(一廣州周立功單片機發(fā)地址:廣州市天河北路689號光大銀行12樓F4:510630 :

地址:市海淀區(qū)知春路113號銀網(wǎng)中心A1207-1208室(中發(fā)電子市場斜對面)

地址:市一環(huán)路南二段1號數(shù)碼同人港401(磨子橋立交西北角地址:市深南中路2070號電子科技C座樓D

地址:市洪山區(qū)廣埠屯珞瑜路158號12128(華中電腦數(shù)碼市場

銷售與服務網(wǎng)絡(二廣州致遠 技術(shù)支持CAN-

iCAN及模塊

ARM嵌入式系統(tǒng)

銷售維修目TOC\o"1-2"\h\z\u簡 RAWAPI參考手 簡介——回調(diào)函 應用程序狀態(tài)設置函 建立TCP連接函 TCP數(shù)據(jù)發(fā)送函 TCP數(shù)據(jù)接收函 應用程序輪詢工作原理及相關(guān)函 關(guān)閉與中止連接的函 底層TCP接 UDP接口函 應用程序?qū)?UDP服務器通信實 UDP客戶端通信實 TCP客戶端通信實 工程技術(shù)筆 ?2008GuangzhouZHIYUANElectronics 簡low-level"core"/"callback"or"raw"——低水平的、基于回調(diào)函數(shù)的API(后面直接稱RAWhigher-level"sequential"——高水平的、連續(xù)的API(后面直接稱sequentialLwIP棧編程的時候,sequentialAPIBSD質(zhì)上講,TCP/IP協(xié)議棧的通信過程是驅(qū)動的,因此,TCP/IP的代碼和用戶應用程序的下面,這篇文檔的剩余部分我們來討論RAWAPI,關(guān)于sequentialAPI的編程使用方法作使用RAWAPI進行TCP/IP編程,可以使應用程序的代碼和TCP/IP協(xié)議棧的代碼很好地結(jié)合起來。程序的執(zhí)行機制是以回調(diào)函數(shù)為基礎(chǔ)的驅(qū)動的,同時回調(diào)函數(shù)也是被TCP/IP代碼直接調(diào)用的。TCP/IP代碼和應用程序的代碼運行在同一個線程里面。sequentialRAWAPI接口函數(shù)不僅在程序代碼的執(zhí)行時間上更快,而且在運行中它也占用更少的和RAM都較小的嵌入式系統(tǒng)中,這也是我們優(yōu)先考慮采用的方法。API我們可以同時采用。實際上,sequential就是一種利用RAWAPI來實現(xiàn)的一種屬于協(xié)議本體的應用程序RAWAPI簡介程序的執(zhí)行是靠回調(diào)函數(shù)來驅(qū)動的。每一個回調(diào)函數(shù)也只不過是一個能夠直接被TCP/IP代碼調(diào)用的普通的C語言函數(shù)。每一個回調(diào)函數(shù)的調(diào)用都是傳遞一個當前連接UDP或TCP的狀態(tài)。另外,為了使應用程序有一個明確的執(zhí)行狀態(tài),回調(diào)函數(shù)的指定是可編程的,并且是獨立于TCP/IP狀態(tài)之外的。該函數(shù)用于傳遞給應用程序的具體狀態(tài),在控制塊標志建立以后調(diào)用,即在函數(shù)tcp_new()(請見表2.2)調(diào)用之后才能調(diào)用,該函數(shù)的詳細描述請見表2.12.1函數(shù)voidtcp_arg(structtcp_pcb*pcb,voidpcb:當前TCParg:需要傳遞給回調(diào)函數(shù)的參無TCP連接函sequentialAPIBSDsocketAPI都非常相似。一個新的TCP連接的標志(實質(zhì)上是一個協(xié)議控制塊-PCB)tcp_new()函數(shù)來創(chuàng)建。連接創(chuàng)建后,該PCB可以進入狀態(tài),等待數(shù)據(jù)接收的連接信號,也可以直接連接另外一個主機。函數(shù)的詳細描述請見表2.2。2.2函數(shù)建立一個新的連接標志structtcp_pcb無 正常建立了連接標志,返回建立的NULL:新的pcb內(nèi)存不可該函數(shù)用戶綁定本地的P地址和端,用戶可以將其綁定在一個任意的本地P地址tc_2.2。表2.3函數(shù)綁定本地IPerr_ttcp_bind(structtcp_pcb*pcb,structip_addr*ipaddr,u16_t 準備綁定的連接,類似于BSD標準中的port:綁定的本地端。注意:千萬不要和其它的應用程序產(chǎn)ERR_OK:正確地綁定了指定的連 指定的端已經(jīng)綁定了接,產(chǎn)生當一個正在請求的連接被接收時,由tcp_accept()(請見表2.7)函數(shù)指定的回調(diào)函數(shù)將會被調(diào)用。當然,在調(diào)用本函數(shù)前,必須首先調(diào)用函數(shù)tcp_bind()(2.3)來綁定一個本地的IP地址和端。該函數(shù)的詳細描述請見表2.4。2.4函數(shù)structtcp_pcb*tcp_listen(structtcp_pcbpcb:返回一個新的連接標志pcb,它作為一個參數(shù)傳遞給將要被分派的函數(shù)。這樣做的原因是處于狀態(tài)的連接一般只需要較小的內(nèi)存,于是函數(shù)tcp_listen()就會收回原始連接的NULL:狀態(tài)的連接的內(nèi)存塊不可用時,返回NULL。如果這樣的話,作為參數(shù)傳遞給函tcp_listen()的pcb所占用的內(nèi)存將不能夠被分配通過參數(shù)backlog來實現(xiàn)的。要使用該函數(shù),需要在配置文件lwipopts.h中設置TCP_LISTEN_BACKLOG=1。該函數(shù)的詳細描述請見表2.5。2.5函數(shù)structtcp_pcb*tcp_listen_with_backlog(structtcp_pcb*pcb,u8_t backlog:限制隊列中連接的數(shù)pcb:返回一個新的連接標志pcb,它作為一個參數(shù)傳遞給將要被分派的函數(shù)。這樣做的原因是處于狀態(tài)的連接一般只需要較小的內(nèi)存,于是函數(shù)tcp_listen()就會收回原始連接的NULL:狀態(tài)的連接的內(nèi)存塊不可用時,返回NULL。如果這樣的話,作為參數(shù)傳遞給函tcp_listen()的pcb所占用的內(nèi)存將不能夠被分這個函數(shù)通常在“accept”的回調(diào)函數(shù)中被調(diào)用。它允許LwIP去執(zhí)行一些內(nèi)務工作,2.6函數(shù)通知LwIPvoidtcp_accepted(structtcp_pcb 無當處于的連接與一個新來的連接連接上后,該函數(shù)指定的回調(diào)函數(shù)將被調(diào)用。通常在tcp_listen()(請見表2.4)函數(shù)調(diào)用之后調(diào)用。該函數(shù)的詳細描述請見表2.7。表2.7函數(shù)voidtcp_accept(structtcp_pcberr_terr))pcb:指定一個處于狀態(tài)的連無請求參數(shù)pcb指定的連接連接到主機,并發(fā)送打開連接的最初的SYN段。函數(shù)調(diào)用connected函數(shù)來設置相應的參數(shù)err。該函數(shù)的詳細描述請見表2.8。表2.8函數(shù)err_ttcp_connect(structtcp_pcbu16_tport,err_t(*connected)(voiderr_terr)) 指定接ipaddr:指定連接主機的IP地 ERR_MEM:當SYN段的內(nèi)存不可用時,即連接沒有成功建ERR_OK:當SYN被正確地時,即連接成功建TCP數(shù)據(jù)發(fā)送函據(jù)放入到發(fā)送隊列,由協(xié)議內(nèi)核來決定發(fā)送。發(fā)送隊列中可用字節(jié)的大小可以通過函數(shù)tcp_sndbuf()來重新獲得。使用這個函數(shù)的一個比較恰當?shù)姆椒ㄊ且院瘮?shù)tcp_sndbuf()返回的2.9函數(shù)發(fā)送TCPerr_ttcp_write(structtcp_pcbu16_tlen,u8_tcopy) 了文件lwipoptsh中定義的上限(即最大值),則函數(shù)tcp_write()調(diào)用失敗,返ERR_MEMERR_OK:數(shù)據(jù)被正確地放入到發(fā)送隊列中,返回tcp_sent該函數(shù)用于設定主機成功接收到數(shù)據(jù)后調(diào)用的回調(diào)函數(shù),通常也在函tcp_listen()(請見表2.4)之后調(diào)用。該函數(shù)的詳細描述請見表2.102.10函數(shù)voidtcp_sent(structtcp_pcberr_t(*sent)(voidu16_tlen))pcb:指定一個與主機相連接的連接sent:指定主機成功地接收到數(shù)據(jù)后調(diào)用的回調(diào)函數(shù)?!發(fā)en”作為參數(shù)傳遞給回調(diào)函數(shù),給無TCP數(shù)據(jù)接收函TCP數(shù)據(jù)的接收是基于回調(diào)函數(shù)的,當新的數(shù)據(jù)到達時,應用程序指定的回調(diào)函數(shù)將會被調(diào)用。當應用程序接收到數(shù)據(jù)后,它必須立即調(diào)用tcp_recved()來指示接收數(shù)據(jù)的tcp_recv表2.11函數(shù)voidtcp_recv(structtcp_pcberr_t(*recv)(voidstructpbuf*p,err_tpcb:指定一個與主機相連接的連接recv:指定當新的數(shù)據(jù)接收到時調(diào)用的回調(diào)函數(shù)。該回調(diào)函數(shù)可以通過傳遞一個NULL的pbuf結(jié)便LwIP內(nèi)核可以保存該結(jié)構(gòu),從而等待以后處理無表2.12函數(shù)voidtcp_recved(structtcp_pcb*pcb,u16_tpcb:指定一個與主機相連接的連接len:獲取接收到的數(shù)據(jù)的長度無當連接是空閑的時候(也就是說沒有數(shù)據(jù)發(fā)送與接收),LwIP將會通過一個回調(diào)函數(shù)來函數(shù)tcp_write()。用的回調(diào)函數(shù)。該函數(shù)的詳細描述請見表2.13。表2.13函數(shù)voidtcp_poll(structtcp_pcberr_t(*poll)(void*arg,structtcp_pcb*tpcb),u8_tinterval)pcb:指定接poll鐘兩次。把參數(shù)“interval”設置為10意味著應用程序?qū)⒚?秒鐘輪詢一次。無2.14函數(shù)關(guān)閉一個指定的TCP連接,調(diào)用該函數(shù)后,TCP代碼將會釋放(刪除)pcberr_ttcp_close(structtcp_pcbpcb:指定一個需要關(guān)閉的連接ERR_OK:連接正常關(guān)是不會失敗的,它一定能完成中止的目的。該函數(shù)的詳細描述請見表2.15。通過函數(shù)tcp_err()(請見表2.16)來完成。2.15函數(shù)中止一個指定的連接voidtcp_abort(structtcp_pcbpcb:指定一個需要關(guān)閉的連接無數(shù)的詳細描述請見表2.16。2.16函數(shù)voidtcp_err(structtcp_pcbvoid(*err)(void*arg,err_tpcb:指定需要處理的發(fā)送錯誤的連接 指定發(fā)送錯誤時調(diào)用的回調(diào)函數(shù)。因為pcb結(jié)構(gòu)可能已經(jīng)被刪除了,所以在處理錯誤的回調(diào)函數(shù)中pcb參數(shù)不可能傳遞進來。無TCP必須被在調(diào)用其他的TCP函數(shù)之前被首先調(diào)用。另外,在系統(tǒng)正常運行的過程中,兩個定時器函數(shù)tcp_fasttmr()和tcp_slowtmr必須以固定的時間間隔有規(guī)律地被調(diào)用。函數(shù)tcp_fasttmr()應該每TCP_FAST_INTERVAL毫秒被調(diào)用一次,而函數(shù)tcp_slowtmr()應該每ERVAL都在文件tcp.h中定義)UDP接口函UDPTCPUDP接口將會非請見表2.17。2.17函數(shù)UDP通信的UDP控制塊structudp_pcb無2.17)調(diào)用之后,當不需要該網(wǎng)絡連接來通信了,就需要將其刪除,以釋放該連接(pcb)所占用的資源。該函數(shù)的詳細描述請見表2.18。2.18函數(shù)刪除并釋放掉一個voidudp_remove(structudp_pcbpcb:指定要刪除的連接無該函數(shù)用戶綁定本地的IP地址和端,用戶可以將其綁定在一個任意的本地IP地址上,它也只能在函數(shù)udp_new()(請見表2.17)調(diào)用之后才能調(diào)用。該函數(shù)的詳細描述請見表2.19函數(shù)為指定的連接綁定本地IPerr_tudp_bind(structudp_pcbu16_tport)pcb:指定接ipaddr:綁定的本地IP地址。如果為IP_ADDR_ANY,則將連接綁定到所有的本地IPERR_OK:正確地綁定了指定的連 指定的端已經(jīng)綁定了接,產(chǎn)生號。該函數(shù)的詳細描述請見表2.20。2.20函數(shù)err_tudp_connect(structudp_pcbu16_tport)pcb:指定接(pcb)ipaddr:設置連接的主機IP地址port:設置連接的主機ERR_OK:正確連接到主其它值:LwIP了連接的地址。該函數(shù)的詳細描述請見表2.21。2.21函數(shù)關(guān)閉參數(shù)“pcb”指定的連接,同函數(shù)udp_connect()voidudp_disconnect(structudp_pcbpcb:指定要刪除的連接無該函數(shù)使用UDP協(xié)議發(fā)送pbufp指向的數(shù)據(jù)。在需要發(fā)送數(shù)據(jù)時調(diào)用,發(fā)送后,該pbuf該函數(shù)的詳細描述請見表2.22。2.22函數(shù)UDP協(xié)議發(fā)送pbufperr_tudp_send(structudp_pcb*pcb,structpbufpcb:指定發(fā)送數(shù)據(jù)的連接p:包含需要發(fā)送數(shù)據(jù)的pbufudp_connect()指定的將會被刷新。該函數(shù)的詳細描述請見表2.23。2.23函數(shù)向具有指定的IP地址和端主機發(fā)送UDP數(shù)err_tudp_sendto(structudp_pcbstructpbufu16_tdst_port)pcb:指定發(fā)送數(shù)據(jù)的連接(pcb) 包含需要發(fā)送數(shù)據(jù)的pbuf鏈dst_ip:發(fā)送數(shù)據(jù)的主機IP地dst_port:發(fā)送數(shù)據(jù)的主機同函數(shù)udp_send()遞進主機的IP地址、端及接收到的數(shù)據(jù)等信息。該函數(shù)的詳細描述請見表2.24表2.24函數(shù)voidudp_recv(structudp_pcbvoid(*recv)(void*arg,structudp_pcb*upcb,structpbuf*p,u16_tport),void 指定接 指定數(shù)據(jù)包接收到時的回調(diào)recv_arg:傳遞給回調(diào)函數(shù)的無#define#define#define 以太網(wǎng)控制器的物理地址,即MAC地//以太網(wǎng)通信的IP#define //上一章我們介紹了LwIP的一些比較底層的RAWAPI函數(shù),這一章使用這些函數(shù)來進行簡#define#define#define 以太網(wǎng)控制器的物理地址,即MAC地//以太網(wǎng)通信的IP#define //注意:本章的所有程序都Luminary公司生產(chǎn)的群星系列單片機,在EK-LM3S6965評UDP服務器通信實無連接 不基于連接來傳輸數(shù)據(jù)不可靠:UDPUDP傳送的數(shù)據(jù)是不可靠的,只有報頭的校驗和,計算方法與IP數(shù)據(jù)報的校驗和計算方法相同。分段:UDPLwIP的RAWAPI提供了較底層的UDP接口函數(shù)。這些函數(shù)與BSD標準的Sockets相比雖較寶貴的嵌入式系統(tǒng)中,這通常我們的首選。況且,這些函數(shù)的編程思想是和BSD標準的UDP協(xié)議通信的數(shù)據(jù)收發(fā)。源代碼如程序3.1所示。程序3.1UDP服務器通信實例代voidvoidUDP_Receive(void*arg,structudp_pcb*upcb,structpbuf*p,structip_addr*addr,u16_t{structip_addrdestAddr=if(p!=/*獲 主機IP地/*初始化LwIP協(xié)議棧,包括軟件{;}{/*{/*}/*}void{structudp_pcbUdpPcb=/*建立UDP通信的控制塊 /*綁定本地IP/*}int{}設置數(shù)據(jù)接收時的回調(diào)函數(shù)UDP_Receive()UDP_Receive()就是在數(shù)據(jù)接收時的回調(diào)函數(shù)。當有UDP數(shù)據(jù)接收到時,該函數(shù)如果p不為空,說明數(shù)據(jù)被正確地接收,這時我們再將數(shù)據(jù)發(fā)送回去。UDP客戶端通信實

3.1UDP行一定的處理,將數(shù)據(jù)保存在pbuf結(jié)構(gòu)中,才能夠發(fā)送。程序?qū)崿F(xiàn)代碼如程序3.2所程序3.2UDP客戶端通信實例代voidvoidDelay(unsignedlong/*利用循環(huán)產(chǎn)生一定的延時{while(--ulVal!=0}conststaticint8UDPData[]="LwIPUDP客戶端在Luminary微控制器上的測試\r\n";intmain(){structudp_pcbstructip_addrstructpbufp=p->payload=(voidUdpPcb=綁定本地IP{ }}本程序給出的是P客戶端通信的主函數(shù)。程序運行后,首先,初始化硬件,初始化L協(xié)議棧,之后就可以正常調(diào)用L的WP函數(shù)了。P通信的建立和上節(jié)的pupupuf_alocpbupbualoc(3.1將要發(fā)送的數(shù)據(jù)存放在uf結(jié)構(gòu)中了,數(shù)據(jù)在f中就是它的數(shù)據(jù)項palod。之后,就表3.1函數(shù)分配一個指定類型(例如一個PBUF_POOL鏈表)structpbuf*pbuf_alloc(pbuf_layeru16_tpbuf_typesize:pbuf->payload的長度,即pbuftype:該參數(shù)決定怎樣以及在那個區(qū)分配pbuf結(jié)構(gòu),具體如下PBUF_RAM:為pbuf分配一塊相當大的緩沖區(qū)內(nèi)存,它同時包含了協(xié)議頭。PBUF_ROMpbufROM而只能定義PBUF_REF。程里面。如果pbuf在隊列中,那么就應該以緩沖區(qū)的方式來它。PBUF_POOL:作為一個鏈表來分 pbuf,并且分配時應該在初始化函數(shù)pbuf_init()中pbuf:分配了內(nèi)存的pbuf1025端口上建立一個UDP連接。點擊連接按鈕后,在接收數(shù)據(jù)框中,可看到發(fā)送的數(shù)據(jù),如圖3.2所示。WEB服務器實

3.2UDPTCPTCP/IPTCP的分量。TCP是基于IP數(shù)據(jù)幀的傳輸,提供可靠的數(shù)據(jù)傳輸服務。TCP具有以下特點:TCP連接中斷過雙向傳輸:TCP2個邏輯管道,一收一發(fā)。數(shù)據(jù)可以同時進行收和發(fā),TCP報頭包含傳出數(shù)據(jù)和確認輸入數(shù)據(jù)的序列號??煽總鬏敚篢CPTCP報頭的序列號和確認號都是以字節(jié)為單位確定的。TCP不知道所傳輸?shù)淖止?jié)流的內(nèi)容流控制:TCP協(xié)議中還規(guī)定了數(shù)據(jù)傳輸?shù)牧髁靠刂?,防止堵塞。在?shù)據(jù)傳輸?shù)碾p方而雙方的接收緩沖區(qū)都是獨立的,也不會溢出。應用層數(shù)據(jù)分段:TCP建立連接時,雙方都交換可接收的最大段,如果接收到一對一傳輸:TCP協(xié)議實現(xiàn)一對一通LwIP的RAWAPI提供了較底層的TCP接口函數(shù)。這些函數(shù)與BSD標準的Sockets相比雖較寶貴的嵌入式系統(tǒng)中,這通常我們的首選。況且,這些函數(shù)的編程思想是和BSD標準的個WEB服務器。源代碼如程序3.3所示。程序3.3WEB服務器實例代constconststaticuint8這里是LwIPTCP在LuminaryCortex-M3conststaticuint8http_html_hdr[]="HTTP/1.1200OK\r\nContent-type:/*******************這是一個回調(diào)函數(shù),當一個TCP段到達這個連接時會被調(diào)用staticerr_thttp_recv(void*arg,structtcp_pcb*pcb,structpbuf*p,err_t{if(p!={/*發(fā)送http/*發(fā)送http /*釋放該TCP}err=return/*}staticerr_thttp_accept(void*arg,structtcp_pcb*pcb,err_terr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論