正点原子lwIP学习笔记——NETCONN接口UDP实验

1. NETCONN接口UDP配置

  1. netconn_new:创建NETCONN控制块(udp_new/udp_recv);
  2. netconn_bind:绑定本地IP地址和端口号;
  3. netconn_connect:绑定目的IP地址和目的端口号并且插入PCB链表;
  4. send/recv:调用NETCONN相关函数发送和接收数据。

具体的原理,在UDP实验中已经有过介绍,其实就是netconn再次封装去调用udp的函数

2. NETCONN接口UDP实验

例程功能:
本实验使用 NETCONN 编程接口实现 UDP 连接,我们可通过按下 KEY0 按键发送数据至网络调试助手,还可以接收网络调试助手发送的数据,并在 LCD 显示屏上显示。

在main.c中,最后调用freertos_demo开启OS;FreeRTOS中先配置各个任务的优先级和任务堆栈;freertos_demo中,创建start_task任务,然后开启任务调度

start_task中,先调用lweip_test_ui开启lcd的一些显示界面的内容;taskENTER_CRITICAL进入临界区后,xQueueCreate创建消息队列

然后通过xTaskCreate创建lwIP任务、key任务、LED任务和显示任务;然后vTastDelete删除开始的start_task任务后,taskEXIT_CRITICAL退出临界区;

key和LED就不多做讲解比较简单;

显示任务就是display_task,会先mymalloc申请内存给数据缓冲区buffer,如果有消息了,消息队列g_display_queue非空,就把buffer用memset先清零,然后xQueueReceive接收消息,在通过lcd的函数进行显示;显示完成后,myfree释放buffer内存;

lwIP的任务就是lwip_demo_task,会调用lwip_demo;这个函数中就是本次课程的重点lwIP协议的各个实现;先通过netconn_new创建控制块,NETCONN_UDP是传入的初值,等于0x20代表采用UDP;然后定义接收超时时间;

创建完成后,调用netconn_bind绑定控制块的本地IP地址和端口;然后netconn_connect连接本地和远程;

完成后,判断指定按键是否按下,按下了就会netbuf_new构建一个sentbuf的pbuf数据,然后netbuf_alloc创建内存,用memcpy把数据拷贝仅这个pbuf里面,最后把判断的数据位清零并调用netbuf_delete释放sentbuf内存;

接收数据则调用netconn_recv,把数据传入recvbuf,如果recvbuf非空,就可以遍历pbuf链表用memcpy把数据拷贝到数据缓冲区g_lwip_demo_recvbuf(先用memset清零);然后调用xQueueSend以消息队列方式发送到显示任务中显示;最后netbuf_delete释放recvbuf的内存

总结

使用NETCONN实验UDP,比使用RAW接口要简单很多,回调函数不需要自己实现,只需要在FreeRTOS中创建对应任务之后,在构建消息队列完成数据的传输就可以了。

你可能感兴趣的:(lwIP学习,学习,笔记,udp,stm32,网络协议)