四轴飞行器wifi开发板及其lwip编程指南_第1页
四轴飞行器wifi开发板及其lwip编程指南_第2页
四轴飞行器wifi开发板及其lwip编程指南_第3页
四轴飞行器wifi开发板及其lwip编程指南_第4页
四轴飞行器wifi开发板及其lwip编程指南_第5页
免费预览已结束,剩余27页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TCP/IP协议栈应

LwIP接口及编程指LwIP,RAW摘LwIP在无操作系统支持环境下的API函数介绍及编程应用。首先,介绍了RAWAPI的特点及优缺点,然后逐个介绍了LwIP提供的所有的RAWAPI函数,修订历修改了UDP服务器的程序。因为作为服务器的主机并不一定参数中获取了客户机的IP地址及端等信息。销售与服务网络(一广州周立功单片机发地址:广州市天河北路689号光大银行12楼F4:510630 :

地址:市海淀区知春路113号银网中心A1207-1208室(中发电子市场斜对面)

地址:市一环路南二段1号数码同人港401(磨子桥立交西北角地址:市深南中路2070号电子科技C座楼D

地址:市洪山区广埠屯珞瑜路158号12128(华中电脑数码市场

销售与服务网络(二广州致远 技术支持CAN-

iCAN及模块

ARM嵌入式系统

销售维修目TOC\o"1-2"\h\z\u简 RAWAPI参考手 简介——回调函 应用程序状态设置函 建立TCP连接函 TCP数据发送函 TCP数据接收函 应用程序轮询工作原理及相关函 关闭与中止连接的函 底层TCP接 UDP接口函 应用程序实 UDP服务器通信实 UDP客户端通信实 TCP客户端通信实 工程技术笔 ©2008GuangzhouZHIYUANElectronics 简low-level"core"/"callback"or"raw"——低水平的、基于回调函数的API(后面直接称RAWhigher-level"sequential"——高水平的、连续的API(后面直接称sequentialLwIP栈编程的时候,sequentialAPIBSD质上讲,TCP/IP协议栈的通信过程是驱动的,因此,TCP/IP的代码和用户应用程序的下面,这篇文档的剩余部分我们来讨论RAWAPI,关于sequentialAPI的编程使用方法作使用RAWAPI进行TCP/IP编程,可以使应用程序的代码和TCP/IP协议栈的代码很好地结合起来。程序的执行机制是以回调函数为基础的驱动的,同时回调函数也是被TCP/IP代码直接调用的。TCP/IP代码和应用程序的代码运行在同一个线程里面。sequentialRAWAPI接口函数不仅在程序代码的执行时间上更快,而且在运行中它也占用更少的和RAM都较小的嵌入式系统中,这也是我们优先考虑采用的方法。API我们可以同时采用。实际上,sequential就是一种利用RAWAPI来实现的一种属于协议本体的应用程序RAWAPI简介程序的执行是靠回调函数来驱动的。每一个回调函数也只不过是一个能够直接被TCP/IP代码调用的普通的C语言函数。每一个回调函数的调用都是传递一个当前连接UDP或TCP的状态。另外,为了使应用程序有一个明确的执行状态,回调函数的指定是可编程的,并且是独立于TCP/IP状态之外的。该函数用于传递给应用程序的具体状态,在控制块标志建立以后调用,即在函数tcp_new()(请见表2.2)调用之后才能调用,该函数的详细描述请见表2.12.1函数voidtcp_arg(structtcp_pcb*pcb,voidpcb:当前TCParg:需要传递给回调函数的参无TCP连接函sequentialAPIBSDsocketAPI都非常相似。一个新的TCP连接的标志(实质上是一个协议控制块-PCB)tcp_new()函数来创建。连接创建后,该PCB可以进入状态,等待数据接收的连接信号,也可以直接连接另外一个主机。函数的详细描述请见表2.2。2.2函数建立一个新的连接标志structtcp_pcb无 正常建立了连接标志,返回建立的NULL:新的pcb内存不可该函数用户绑定本地的P地址和端,用户可以将其绑定在一个任意的本地P地址tc_2.2。表2.3函数绑定本地IPerr_ttcp_bind(structtcp_pcb*pcb,structip_addr*ipaddr,u16_t 准备绑定的连接,类似于BSD标准中的port:绑定的本地端。注意:千万不要和其它的应用程序产ERR_OK:正确地绑定了指定的连 指定的端已经绑定了接,产生当一个正在请求的连接被接收时,由tcp_accept()(请见表2.7)函数指定的回调函数将会被调用。当然,在调用本函数前,必须首先调用函数tcp_bind()(2.3)来绑定一个本地的IP地址和端。该函数的详细描述请见表2.4。2.4函数structtcp_pcb*tcp_listen(structtcp_pcbpcb:返回一个新的连接标志pcb,它作为一个参数传递给将要被分派的函数。这样做的原因是处于状态的连接一般只需要较小的内存,于是函数tcp_listen()就会收回原始连接的NULL:状态的连接的内存块不可用时,返回NULL。如果这样的话,作为参数传递给函tcp_listen()的pcb所占用的内存将不能够被分配通过参数backlog来实现的。要使用该函数,需要在配置文件lwipopts.h中设置TCP_LISTEN_BACKLOG=1。该函数的详细描述请见表2.5。2.5函数structtcp_pcb*tcp_listen_with_backlog(structtcp_pcb*pcb,u8_t backlog:限制队列中连接的数pcb:返回一个新的连接标志pcb,它作为一个参数传递给将要被分派的函数。这样做的原因是处于状态的连接一般只需要较小的内存,于是函数tcp_listen()就会收回原始连接的NULL:状态的连接的内存块不可用时,返回NULL。如果这样的话,作为参数传递给函tcp_listen()的pcb所占用的内存将不能够被分这个函数通常在“accept”的回调函数中被调用。它允许LwIP去执行一些内务工作,2.6函数通知LwIPvoidtcp_accepted(structtcp_pcb 无当处于的连接与一个新来的连接连接上后,该函数指定的回调函数将被调用。通常在tcp_listen()(请见表2.4)函数调用之后调用。该函数的详细描述请见表2.7。表2.7函数voidtcp_accept(structtcp_pcberr_terr))pcb:指定一个处于状态的连无请求参数pcb指定的连接连接到主机,并发送打开连接的最初的SYN段。函数调用connected函数来设置相应的参数err。该函数的详细描述请见表2.8。表2.8函数err_ttcp_connect(structtcp_pcbu16_tport,err_t(*connected)(voiderr_terr)) 指定接ipaddr:指定连接主机的IP地 ERR_MEM:当SYN段的内存不可用时,即连接没有成功建ERR_OK:当SYN被正确地时,即连接成功建TCP数据发送函据放入到发送队列,由协议内核来决定发送。发送队列中可用字节的大小可以通过函数tcp_sndbuf()来重新获得。使用这个函数的一个比较恰当的方法是以函数tcp_sndbuf()返回的2.9函数发送TCPerr_ttcp_write(structtcp_pcbu16_tlen,u8_tcopy) 了文件lwipoptsh中定义的上限(即最大值),则函数tcp_write()调用失败,返ERR_MEMERR_OK:数据被正确地放入到发送队列中,返回tcp_sent该函数用于设定主机成功接收到数据后调用的回调函数,通常也在函tcp_listen()(请见表2.4)之后调用。该函数的详细描述请见表2.102.10函数voidtcp_sent(structtcp_pcberr_t(*sent)(voidu16_tlen))pcb:指定一个与主机相连接的连接sent:指定主机成功地接收到数据后调用的回调函数。“len”作为参数传递给回调函数,给无TCP数据接收函TCP数据的接收是基于回调函数的,当新的数据到达时,应用程序指定的回调函数将会被调用。当应用程序接收到数据后,它必须立即调用tcp_recved()来指示接收数据的tcp_recv表2.11函数voidtcp_recv(structtcp_pcberr_t(*recv)(voidstructpbuf*p,err_tpcb:指定一个与主机相连接的连接recv:指定当新的数据接收到时调用的回调函数。该回调函数可以通过传递一个NULL的pbuf结便LwIP内核可以保存该结构,从而等待以后处理无表2.12函数voidtcp_recved(structtcp_pcb*pcb,u16_tpcb:指定一个与主机相连接的连接len:获取接收到的数据的长度无当连接是空闲的时候(也就是说没有数据发送与接收),LwIP将会通过一个回调函数来函数tcp_write()。用的回调函数。该函数的详细描述请见表2.13。表2.13函数voidtcp_poll(structtcp_pcberr_t(*poll)(void*arg,structtcp_pcb*tpcb),u8_tinterval)pcb:指定接poll钟两次。把参数“interval”设置为10意味着应用程序将每5秒钟轮询一次。无2.14函数关闭一个指定的TCP连接,调用该函数后,TCP代码将会释放(删除)pcberr_ttcp_close(structtcp_pcbpcb:指定一个需要关闭的连接ERR_OK:连接正常关是不会失败的,它一定能完成中止的目的。该函数的详细描述请见表2.15。通过函数tcp_err()(请见表2.16)来完成。2.15函数中止一个指定的连接voidtcp_abort(structtcp_pcbpcb:指定一个需要关闭的连接无数的详细描述请见表2.16。2.16函数voidtcp_err(structtcp_pcbvoid(*err)(void*arg,err_tpcb:指定需要处理的发送错误的连接 指定发送错误时调用的回调函数。因为pcb结构可能已经被删除了,所以在处理错误的回调函数中pcb参数不可能传递进来。无TCP必须被在调用其他的TCP函数之前被首先调用。另外,在系统正常运行的过程中,两个定时器函数tcp_fasttmr()和tcp_slowtmr必须以固定的时间间隔有规律地被调用。函数tcp_fasttmr()应该每TCP_FAST_INTERVAL毫秒被调用一次,而函数tcp_slowtmr()应该每ERVAL都在文件tcp.h中定义)UDP接口函UDPTCPUDP接口将会非请见表2.17。2.17函数UDP通信的UDP控制块structudp_pcb无2.17)调用之后,当不需要该网络连接来通信了,就需要将其删除,以释放该连接(pcb)所占用的资源。该函数的详细描述请见表2.18。2.18函数删除并释放掉一个voidudp_remove(structudp_pcbpcb:指定要删除的连接无该函数用户绑定本地的IP地址和端,用户可以将其绑定在一个任意的本地IP地址上,它也只能在函数udp_new()(请见表2.17)调用之后才能调用。该函数的详细描述请见表2.19函数为指定的连接绑定本地IPerr_tudp_bind(structudp_pcbu16_tport)pcb:指定接ipaddr:绑定的本地IP地址。如果为IP_ADDR_ANY,则将连接绑定到所有的本地IPERR_OK:正确地绑定了指定的连 指定的端已经绑定了接,产生号。该函数的详细描述请见表2.20。2.20函数err_tudp_connect(structudp_pcbu16_tport)pcb:指定接(pcb)ipaddr:设置连接的主机IP地址port:设置连接的主机ERR_OK:正确连接到主其它值:LwIP了连接的地址。该函数的详细描述请见表2.21。2.21函数关闭参数“pcb”指定的连接,同函数udp_connect()voidudp_disconnect(structudp_pcbpcb:指定要删除的连接无该函数使用UDP协议发送pbufp指向的数据。在需要发送数据时调用,发送后,该pbuf该函数的详细描述请见表2.22。2.22函数UDP协议发送pbufperr_tudp_send(structudp_pcb*pcb,structpbufpcb:指定发送数据的连接p:包含需要发送数据的pbufudp_connect()指定的将会被刷新。该函数的详细描述请见表2.23。2.23函数向具有指定的IP地址和端主机发送UDP数err_tudp_sendto(structudp_pcbstructpbufu16_tdst_port)pcb:指定发送数据的连接(pcb) 包含需要发送数据的pbuf链dst_ip:发送数据的主机IP地dst_port:发送数据的主机同函数udp_send()递进主机的IP地址、端及接收到的数据等信息。该函数的详细描述请见表2.24表2.24函数voidudp_recv(structudp_pcbvoid(*recv)(void*arg,structudp_pcb*upcb,structpbuf*p,u16_tport),void 指定接 指定数据包接收到时的回调recv_arg:传递给回调函数的无#define#define#define 以太网控制器的物理地址,即MAC地//以太网通信的IP#define //上一章我们介绍了LwIP的一些比较底层的RAWAPI函数,这一章使用这些函数来进行简#define#define#define 以太网控制器的物理地址,即MAC地//以太网通信的IP#define //注意:本章的所有程序都Luminary公司生产的群星系列单片机,在EK-LM3S6965评UDP服务器通信实无连接 不基于连接来传输数据不可靠:UDPUDP传送的数据是不可靠的,只有报头的校验和,计算方法与IP数据报的校验和计算方法相同。分段:UDPLwIP的RAWAPI提供了较底层的UDP接口函数。这些函数与BSD标准的Sockets相比虽较宝贵的嵌入式系统中,这通常我们的首选。况且,这些函数的编程思想是和BSD标准的UDP协议通信的数据收发。源代码如程序3.1所示。程序3.1UDP服务器通信实例代voidvoidUDP_Receive(void*arg,structudp_pcb*upcb,structpbuf*p,structip_addr*addr,u16_t{structip_addrdestAddr=if(p!=/*获 主机IP地/*初始化LwIP协议栈,包括软件{;}{/*{/*}/*}void{structudp_pcbUdpPcb=/*建立UDP通信的控制块 /*绑定本地IP/*}int{}设置数据接收时的回调函数UDP_Receive()UDP_Receive()就是在数据接收时的回调函数。当有UDP数据接收到时,该函数如果p不为空,说明数据被正确地接收,这时我们再将数据发送回去。UDP客户端通信实

3.1UDP行一定的处理,将数据保存在pbuf结构中,才能够发送。程序实现代码如程序3.2所程序3.2UDP客户端通信实例代voidvoidDelay(unsignedlong/*利用循环产生一定的延时{while(--ulVal!=0}conststaticint8UDPData[]="LwIPUDP客户端在Luminary微控制器上的测试\r\n";intmain(){structudp_pcbstructip_addrstructpbufp=p->payload=(voidUdpPcb=绑定本地IP{ }}本程序给出的是P客户端通信的主函数。程序运行后,首先,初始化硬件,初始化L协议栈,之后就可以正常调用L的WP函数了。P通信的建立和上节的pupupuf_alocpbupbualoc(3.1将要发送的数据存放在uf结构中了,数据在f中就是它的数据项palod。之后,就表3.1函数分配一个指定类型(例如一个PBUF_POOL链表)structpbuf*pbuf_alloc(pbuf_layeru16_tpbuf_typesize:pbuf->payload的长度,即pbuftype:该参数决定怎样以及在那个区分配pbuf结构,具体如下PBUF_RAM:为pbuf分配一块相当大的缓冲区内存,它同时包含了协议头。PBUF_ROMpbufROM而只能定义PBUF_REF。程里面。如果pbuf在队列中,那么就应该以缓冲区的方式来它。PBUF_POOL:作为一个链表来分 pbuf,并且分配时应该在初始化函数pbuf_init()中pbuf:分配了内存的pbuf1025端口上建立一个UDP连接。点击连接按钮后,在接收数据框中,可看到发送的数据,如图3.2所示。WEB服务器实

3.2UDPTCPTCP/IPTCP的分量。TCP是基于IP数据帧的传输,提供可靠的数据传输服务。TCP具有以下特点:TCP连接中断过双向传输:TCP2个逻辑管道,一收一发。数据可以同时进行收和发,TCP报头包含传出数据和确认输入数据的序列号。可靠传输:TCPTCP报头的序列号和确认号都是以字节为单位确定的。TCP不知道所传输的字节流的内容流控制:TCP协议中还规定了数据传输的流量控制,防止堵塞。在数据传输的双方而双方的接收缓冲区都是独立的,也不会溢出。应用层数据分段:TCP建立连接时,双方都交换可接收的最大段,如果接收到一对一传输:TCP协议实现一对一通LwIP的RAWAPI提供了较底层的TCP接口函数。这些函数与BSD标准的Sockets相比虽较宝贵的嵌入式系统中,这通常我们的首选。况且,这些函数的编程思想是和BSD标准的个WEB服务器。源代码如程序3.3所示。程序3.3WEB服务器实例代constconststaticuint8这里是LwIPTCP在LuminaryCortex-M3conststaticuint8http_html_hdr[]="HTTP/1.1200OK\r\nContent-type:/*******************这是一个回调函数,当一个TCP段到达这个连接时会被调用staticerr_thttp_recv(void*arg,structtcp_pcb*pcb,structpbuf*p,err_t{if(p!={/*发送http/*发送http /*释放该TCP}err=return/*}staticerr_thttp_accept(void*arg,structtcp_pcb*pcb,err_terr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论