STM32的lwip使用说明

2019-07-14 09:01发布

STM32lwip使用说明 在使用LWIPTCP/IP协议的,怎么让他跑起来,可以接收数据。我们需要做一下几个步骤,只要这几个步骤初始化好了,那么我们的板子就可以正常收发数据了。    (一)、TCP/IP的初始化。 1.新建PCB -- pcb = tcp_new();这个是TCP的控制模块。 2.设置我们的TCP服务的优先级--tcp_setprio(pcb, HTTPD_TCP_PRIO); (这个似乎不设置也可以正常使用)。 3.绑定IP与端口,在此种情况下我们默认IP是缺省的,即任意IP都可以连接我们的目标板。(除非对特定的IP有限制,否则不建议设定特殊IP地址);端口的绑定,比如网页默认的端口号是80(这个端口号我们也可以修改为6060之类的)。端口号可以理解为我们应用程序的一个接口,具有唯一性。--tcp_bind(pcb, IP_ADDR_ANY, 6060);例:我们想访问这个应用程序,端口号就必须是6060才可以访问。 4.在初始化完成以上步骤后,我们需要此PCB控制块放到监听序列中去,仅仅是挂到序列中。--pcb = tcp_listen(pcb); 5.最后一步也是最重要的一步,是把我们数据处理的函数通过回调的方式给LWIP内核进行调用。其实就是把我们的数据处理函数地址赋给相应的pcb->accept变量。这样的作用是一旦有TCP的连接,内核会直接调用到我们的数据处理函数,我们就可以编写程序进行相应的数据处理。--tcp_accept(pcb, XX_accept);我们的回调函数名是XX_accept。以上五个步骤是可以正常初始化TCP/IP的必要步骤。接下来讲一下我们的数据处理函数。 (二)、数据处理函数。 1.由于我们已经在上面第5步把我们的函数地址赋给了pcb->accept变量,一旦有连接,内核就会回调到相应的PCB对应的数据处理函数。 2.数据处理函数里面有一个重要的函数:接收函数。这个函数也使用了回调的机制。--tcp_recv(pcb, XX_recv);当有数据到来,则会调用函数名为 XX_recv的处理函数。真正的数据就在这个函数XX_recv里面了。 1)下面着重讲一下XX_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)函数。函数的参数里面的struct pbuf *p是我们的重点,因为它里面就包含了我们需要的数据。在此结构体数据指针payload所指向的位置,我们只需要按照顺序把数据取出来即可。 2)里面还有一个比较重要的函数是tcp_recved(pcb, p->tot_len);它的作用是告知内核还有多少数据,需要堆栈调整多大的接收窗口来接收后面的数据。 3)操作完后需要释放相应的空间,否则就会出现内存溢出的风险。函数是--pbuf_free(p); 4)最后是结束本次连接,相应函数是--tcp_close(pcb); 到此我们从初始化到数据的接收接口讲完了,总结一下就是: 1.pcb=tcp_close(pcb);新建新的PCB控制块。 2.tcp_setprio(pcb, HTTPD_TCP_PRIO); 设置其优先级。 3.tcp_bind(pcb, IP_ADDR_ANY, 端口号);绑定IP地址和端口号。 4.pcb = tcp_listen(pcb);把相应的控制块放到监听序列中。 5.tcp_accept(pcb, XX_accept);设置相应的数据处理回调函数。 6.在tcp_recv(pcb, XX_recv);设置数据接收回调函数,一旦有数据接收,则调用XX_recv函数。 7.到这步我们的数据已经是接收下来了,在pbufpayload数据指针指向的区域,只要按照顺序就可以读取数据出来。