OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 42|回复: 0

《ESP32-S3使用指南—IDF版 V1.6》第五十二章 UDP实验

[复制链接]

1185

主题

1198

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
5120
金钱
5120
注册时间
2019-5-8
在线时间
1279 小时
发表于 昨天 09:24 | 显示全部楼层 |阅读模式
第五十二章 UDP实验


1)实验平台:正点原子DNESP32S3开发板

2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6

3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子DNESP32S3开发板技术交流群:132780729


2.jpg

3.png

对于lwIP的Socket的使用方式,它与文件操作非常相似。在文件操作中,我们首先打开文件,然后进行读/写操作,最后关闭文件。在TCP/IP网络通信中,也存在着相同的操作流程,但所使用的接口不再是文件描述符或FILE*,而是被称为Socket的描述符。通过Socket,我们可以进行读、写、打开和关闭操作来进行网络数据的传输。此外,还有一些辅助函数,如查询域名/IP地址和设置Socket功能等。在本章中,我们将使用Socket编程接口来实现UDP实验。
本章分为如下几个部分:
52.1 Socket编程UDP连接流程
52.2 硬件设计
52.3 软件设计
52.4 下载验证


52.1 Socket编程UDP连接流程
在实现UDP协议之前,用户需要按照以下步骤配置结构体sockaddr_in的成员变量,以便建立UDP连接:
①:配置ESP32-S3设备连接网络(必须的,因为WiFi是无线通信,所以需搭建通信桥梁)。
②:将sin_family设置为AF_INET,表示使用IPv4网络协议。
③:设置sin_port为所需的端口号,例如8080。
④:设置sin_addr.s_addr为本地IP地址。
⑤:调用函数Socket创建Socket连接。请注意,该函数的第二个参数指定连接类型。SOCK_STREAM表示TCP连接,而SOCK_DGRAM表示UDP连接。
⑥:调用函数bind将本地服务器地址与Socket进行绑定。
⑦:调用适当的收发函数来接收或发送数据。
通过遵循这些步骤,用户可以成功地配置并建立UDP连接,以实现数据的发送和接收。


52.2 硬件设计

1. 例程功能
本章实验功能简介:
本实验主要通过Socket编程接口实现了一个UDP服务器。这个服务器具有以下功能:
①:可以通过按键发送UDP广播数据给其他UDP客户端。
②:能够接收其他UDP客户端发送的广播数据。
③:实时将接收到的数据显示在LCD屏幕上。
通过这个实验,用户可深入了解UDP协议的工作原理,并掌握如何使用Socket编程接口来实现UDP通信。这对于开发基于UDP的网络应用程序非常有用,例如实时通信、多播应用等。

2. 硬件资源
1)LED灯
        LED-IO1

2)XL9555
        IIC_INT-IO0(需在P5连接IO0)
        IIC_SDA-IO41
        IIC_SCL-IO42

3)SPILCD
        CS-IO21
        SCK-IO12
        SDA-IO11
        DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
        PWR- IO1_3(XL9555)
        RST- IO1_2(XL9555)

4)ESP32-S3内部WiFi

3. 原理图
本章实验使用的WiFi为ESP32-S3的片上资源,因此并没有相应的连接原理图。


52.3 软件设计

52.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:

第五十二章 UDP实验1300.png
图52.3.1.1 程序流程图

52.3.2 程序解析
在本章节中,我们主要关注两个文件:lwip_demo.c和lwip_demo.h。lwip_demo.h文件主要定义了发送标志位并声明了lwip_demo函数,这部分相对简单,所以我们暂不详细解释。主要关注点是lwip_demo.c文件中的函数。在lwip_demo函数中,我们配置了相关的UDP参数,并创建了一个名为lwip_send_thread的发送数据线程。这个线程通过调用scokec函数来发送数据到服务器。接下来,我们将分别详细解释lwip_demo函数和lwip_send_thread任务。
  1. <font size="3">/* 需要自己设置远程IP地址 */</font>
  2. <font size="3">#define IP_ADDR   "192.168.101.33"</font>

  3. <font size="3">#define LWIP_DEMO_RX_BUFSIZE         200                                    /* 最大接收数据长度 */</font>
  4. <font size="3">#define LWIP_DEMO_PORT               8080                                   /* 连接的本地端口号 */</font>
  5. <font size="3">#define LWIP_SEND_THREAD_PRIO        ( tskIDLE_PRIORITY + 3 )         /* 发送数据线程优先级 */</font>

  6. <font size="3">/* 接收数据缓冲区 */</font>
  7. <font size="3">uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE]; </font>
  8. <font size="3">/* 发送数据内容 */</font>
  9. <font size="3">char g_lwip_demo_sendbuf[] = "ALIENTEK DATA \r\n";</font>
  10. <font size="3">/* 数据发送标志位 */</font>
  11. <font size="3">uint8_t g_lwip_send_flag;</font>
  12. <font size="3">static struct sockaddr_in dest_addr;            /* 远端地址 */</font>
  13. <font size="3">struct sockaddr_in g_local_info;</font>
  14. <font size="3">socklen_t g_sock_fd;                            /* 定义一个Socket接口 */</font>
  15. <font size="3">static void lwip_send_thread(void *arg);</font>
  16. <font size="3">extern QueueHandle_t g_display_queue;           /* 显示消息队列句柄 */</font>


  17. <font size="3">/**</font>
  18. <font size="3"> * @brief       发送数据线程</font>
  19. <font size="3"> * [url=home.php?mod=space&uid=271674]@param[/url]       无</font>
  20. <font size="3"> * @retval      无</font>
  21. <font size="3"> */</font>
  22. <font size="3">void lwip_data_send(void)</font>
  23. <font size="3">{</font>
  24. <font size="3">xTaskCreate(lwip_send_thread, "lwip_send_thread", 4096, </font>
  25. <font size="3">NULL, LWIP_SEND_THREAD_PRIO, NULL);</font>
  26. <font size="3">}</font>

  27. <font size="3">/**</font>
  28. <font size="3"> * @brief       lwip_demo实验入口</font>
  29. <font size="3"> * @param       无</font>
  30. <font size="3"> * @retval      无</font>
  31. <font size="3"> */</font>
  32. <font size="3">void lwip_demo(void)</font>
  33. <font size="3">{</font>
  34. <font size="3">    char *tbuf;</font>
  35. <font size="3">    lwip_data_send();                                          /* 创建发送数据线程 */</font>
  36. <font size="3">    /* 远端参数设置 */</font>
  37. <font size="3">    dest_addr.sin_addr.s_addr = inet_addr(IP_ADDR);              /* 目标地址 */</font>
  38. <font size="3">    dest_addr.sin_family = AF_INET;</font>
  39. <font size="3">    dest_addr.sin_port = htons(LWIP_DEMO_PORT);                 /* 目标端口 */</font>
  40. <font size="3">    </font>
  41. <font size="3">    g_local_info.sin_family = AF_INET;                           /* IPv4地址 */</font>
  42. <font size="3">    g_local_info.sin_port = htons(LWIP_DEMO_PORT);              /* 设置端口号 */</font>
  43. <font size="3">    g_local_info.sin_addr.s_addr = htons(INADDR_ANY);           /* 设置本地IP地址 */</font>

  44. <font size="3">    g_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);            /* 建立一个新的socket连接 */</font>
  45. <font size="3">    </font>
  46. <font size="3">    tbuf = malloc(200);                                        /* 申请内存 */</font>
  47. <font size="3">    sprintf((char *)tbuf, "Port:%d", LWIP_DEMO_PORT);           /* 客户端端口号 */</font>
  48. <font size="3">    lcd_show_string(0, 170, 200, 16, 16, tbuf, MAGENTA);</font>
  49. <font size="3">    </font>
  50. <font size="3">    /* 建立绑定 */</font>
  51. <font size="3">    bind(g_sock_fd, (struct sockaddr *)&g_local_info, sizeof(g_local_info));</font>

  52. <font size="3">    while (1)</font>
  53. <font size="3">    {</font>
  54. <font size="3">        memset(g_lwip_demo_recvbuf, 0, sizeof(g_lwip_demo_recvbuf));</font>
  55. <font size="3">        recv(g_sock_fd, (void *)g_lwip_demo_recvbuf,</font>
  56. <font size="3">             sizeof(g_lwip_demo_recvbuf), 0);</font>
  57. <font size="3">        printf("%s\r\n",g_lwip_demo_recvbuf);</font>
  58. <font size="3">    }</font>
  59. <font size="3">}</font>

  60. <font size="3">/**</font>
  61. <font size="3"> * @brief       发送数据线程函数</font>
  62. <font size="3"> * @param       pvParameters : 传入参数(未用到)</font>
  63. <font size="3"> * @retval      无</font>
  64. <font size="3"> */</font>
  65. <font size="3">void lwip_send_thread(void *pvParameters)</font>
  66. <font size="3">{</font>
  67. <font size="3">    pvParameters = pvParameters;</font>

  68. <font size="3">    while (1)</font>
  69. <font size="3">    {        /* 有数据要发送 */</font>
  70. <font size="3">        if ((g_lwip_send_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA)        </font>
  71. <font size="3">        {</font>
  72. <font size="3">            printf("send\r\n");</font>
  73. <font size="3">            sendto(g_sock_fd,                               /* scoket */</font>
  74. <font size="3">                  (char *)g_lwip_demo_sendbuf,                 /* 发送的数据 */</font>
  75. <font size="3">                  sizeof(g_lwip_demo_sendbuf), 0,                /* 发送的数据大小 */</font>
  76. <font size="3">                  (struct sockaddr *)&dest_addr,           /* 接收端地址信息 */ </font>
  77. <font size="3">                  sizeof(dest_addr));                       /* 接收端地址信息大小 */</font>

  78. <font size="3">            g_lwip_send_flag &= ~LWIP_SEND_DATA;</font>
  79. <font size="3">        }</font>
  80. <font size="3">        </font>
  81. <font size="3">        vTaskDelay(100);</font>
  82. <font size="3">   }</font>
  83. <font size="3">}</font>
复制代码
在源码中,lwip_demo函数通过lwip_data_send创建了发送数据的线程lwip_send_thread,并配置了Socket的UDP协议。该线程在发送前会检查标志位,有效时则通过sendto发送数据并重置标志位。同时,需设置目标IP地址以确保数据正确发送。此外,主函数的循环中不断通过recv接收数据并使用串口输出接收的数据。

52.4 下载验证
在程序中,首先需要设置好能够连接的网络账号和密码。然后,使用笔记本电脑作为终端,确保它与ESP32-S3设备处于同一网络段内。当ESP32-S3设备成功连接到网络时,它的LCD显示屏上会显示相应的内容:

第五十二章 UDP实验4721.png
图52.4.1 设备连接到网络时,LCD显示的信息

打开网络调试助手,然后配置网络参数,如UDP协议、端口号、目标主机设置等,设置内容如下图所示。

第五十二章 UDP实验4798.png

在确保网络连接正常后,可以通过按下开发板上的KEY0按键来发送数据至网络调试助手。当网络调试助手接收到“ALIENTEK DATA”字符串时,它会在显示区域展示这个信息。此外,用户还可以在调试助手的发送区域自行输入要发送的数据,然后点击发送键,将数据发送至ESP32-S3设备。此时,ESP32-S3的串口将打印接收到的数据,具体操作和输出如下图所示。

第五十二章 UDP实验4977.png
图52.4.3 接收网络调试助手的数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-11-20 04:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表