STM32的lwip使用说明
在使用LWIP的TCP/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.到这步我们的数据已经是接收下来了,在pbuf的payload数据指针指向的区域,只要按照顺序就可以读取数据出来。