目录UDP 协议简介UDP 的基本原理UDP 的优势RT-Thread简介RT-Thread特点注意事项应用场景​编辑总结本篇文章我们将详细介绍如何在W55MH32 以太网芯片与 RT-Thread 实时操作系统实现一款同时支持 UDP 服务器 UDP 客户端双模式并行运行的回环测试程序。 通过两个独立线程分别处理 UDP 监听与主动发送逻辑结合 W55MH32 硬件协议栈特性完成双向数据收发验证为嵌入式多角色网络通信提供直接可复用的实践方案。该例程用到的其他网络协议例如 DHCP 请参考相关章节。有关 W55MH32 的初始化过程请参考 Network install 这里将不再赘述。UDP 协议简介UDP是一种无连接、不可靠的轻量级传输层通信协议基于 IP 协议实现数据报文传输。 UDP 不需要提前建立连接直接将数据报文发送到目标地址具有速度快、延迟低、资源占用小的特点是嵌入式设备、实时通信、局域网广播场景中最常用的通信协议之一。UDP 的基本原理无连接发送端不需要与接收端建立连接。不可靠数据可能丢失、重复、乱序。支持单播、广播、组播可一对一会话也可一对多群发。速度极快没有握手、确认、重传机制延迟极低。UDP 的优势轻量高效协议头小CPU 与内存占用极低。传输速度快无握手、无确认适合高速数据传输。支持一对多通信可实现组播、广播适合多设备联动。实时性强适合传感器数据、控制指令、状态上报等场景。结构简单嵌入式设备极易实现稳定性高。RT-Thread简介RT-Thread 是一款由中国社区主导开发的开源、硬实时嵌入式操作系统RTOS。它诞生于 2006 年经过近 20 年的发展已经从最初的一个小巧的内核演变成了一个组件丰富、生态完善的物联网操作系统平台。简单来说它就像是物联网设备的“大脑”和“管家”负责管理硬件资源、调度任务并提供网络连接等高级功能。RT-Thread特点极致轻量与可裁剪它的内核非常精简Nano 版本最小仅需 3KB ROM 和 1KB RAM可以运行在资源极其有限的芯片上如 Cortex-M0。同时它采用“内核组件”的架构你可以像搭积木一样通过图形化工具Env按需裁剪系统功能。硬实时性采用抢占式调度算法保证高优先级任务能立即抢占低优先级任务中断响应时间达到微秒级非常适合对时间要求严苛的工业控制和汽车电子场景。丰富的软件生态这是 RT-Thread 最大的亮点之一。它拥有类似手机应用商店的软件包机制内置了 TCP/IP 协议栈、文件系统、GUI 引擎以及大量的传感器驱动和云连接组件如 MQTT、AWS、阿里云。开发者可以直接复用这些资源极大地加速开发。开源与商业友好遵循 Apache License 2.0 协议这意味着你可以免费将其用于商业产品且无需公开你自己的产品代码。注意事项数据不可靠无重传机制重要数据需自行加以校验。无连接无法保证对方是否在线、是否收到数据。局域网为主组播、广播通常只能在局域网内生效。端口占用同一时间一个端口只能被一个设备使用。应用场景局域网设备发现通过广播或组播自动搜索设备。高速数据采集传感器、采集器实时上传数据到上位机。多设备联动控制一个主机控制多个从机。实时指令下发LED、继电器、电机快速控制。组播同步数据多设备同步接收相同数据。RT-Thread 多任务通信同时运行 UDP HTTP TCP 多协议UDP 报文结构UDP 报文非常简单仅包含基本头部 数据部分源端口发送方的端口号目标端口接收方的端口号数据长度2即整个 UDP 报文的长度包括头部和数据单位为字节校验和校验和结构简单、处理极快非常适合嵌入式平台。UDP 报文实例在W55MH32中UDP协议已在内部硬件协议栈实现 所以我们只需要读取和写入对应寄存器的值即可实现发送和接收数据无需手动组包。| 报文原文 | C0A8 0001 C0A8 0002 1F90 1F91 0021 F7DF 4865 6C6C 6F2C 2055 4450 21 | 报文解析 | 1.IP部分前16字节 C0A8 0001: 源IP地址192.168.0.1 C0A8 0002: 目标IP地址192.168.0.2 2.UDP部分后部分 1F90: 源端口号8080 1F91: 目标端口号8081 0021: 报文长度33字节 F7DF: 校验和校验数据完整性 4865 6C6C 6F2C 2055 4450 21: 数据部分Hello, UDP! 的ASCII表示RT-Thread 运行环境说明采用多线程并发设计UDP 服务端、客户端拆分为两个独立任务互不阻塞、独立调度借助 RT-Thread 临界区接口保护 SPI 硬件总线资源避免多线程抢占导致硬件通信异常基于系统毫秒级延时与任务时间片轮转调度保障网络通信稳定性与实时性原生支持动态线程创建、资源管理代码模块化强便于后续拓展 TCP、MQTT、HTTP 等多协议并发业务。实现过程请注意:测试实例需要 PC 端和 W55MH32 处于同一网段。UDP Server监听 8080 端口接收任意数据并原样回发。UDP Client主动向电脑 192.168.1.147:8080 发送数据实现请求 - 响应式回环。步骤 1初始化 W55MH32 与 RT-Thread 环境初始化网卡硬件、SPI 接口、PHY 链路、DHCP 自动获取 IP并配置 RT-Thread 临界区保护。wiz_toe_init(); reg_wizchip_cris_cbfunc(rt_enter_critical, rt_exit_critical); wiz_phy_link_check(); network_init(ethernet_buf, default_net_info);步骤 2基于 RT-Thread 创建双 UDP 任务使用 RT-Thread 多任务创建两个独立线程Task_UDPC_Handler rt_thread_create(Task UDP Client, Task_UDPC, RT_NULL, 256, 1, 20); Task_UDPS_Handler rt_thread_create(Task UDP Server, Task_UDPS, RT_NULL, 256, 1, 20); rt_thread_startup(Task_UDPC_Handler); rt_thread_startup(Task_UDPS_Handler);步骤 3UDP Server 任务逻辑RT-Thread 独立线程监听本地 8080 端口收到任何数据直接回发。void Task_UDPS(void *parameter) { printf(UDP Server loopback\r\n); printf(Data from any source will be transmitted back.\r\n); while (1) { loopback_udps(SOCKET_UDPS, tcps_ethernet_buf, local_port); rt_thread_mdelay(1); } }步骤 4UDP Client 任务逻辑RT-Thread 独立线程主动向电脑 192.168.1.147:8080 发送数据收到回复后回发。void Task_UDPC(void *parameter) { printf(UDP Client loopback\r\n); printf(Only when the destination address and port number are consistent will it be returned.\r\n); while (1) { loopback_udpc(SOCKET_UDPC, tcpc_ethernet_buf, dest_ip, dest_port); rt_thread_mdelay(1); } }步骤 5网络参数配置主动向电脑 192.168.1.147:8080 发送数据收到回复后回发。wiz_NetInfo default_net_info { .mac {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12}, .ip {192, 168, 1, 30}, .gw {192, 168, 1, 1}, .sn {255, 255, 255, 0}, .dns {8, 8, 8, 8}, .dhcp NETINFO_DHCP }; // 目标电脑 IP 端口 uint8_t dest_ip[4] {192, 168, 1, 147}; uint16_t dest_port 8080; uint16_t local_port 8080;参考代码UDP 任务主逻辑通过 RT-Thread 自动初始化宏 INIT_APP_EXPORT 挂载应用系统上电自动执行网络与任务初始化无需手动调用。#define DEFAULT_MAC_EN 1 #define SOCKET_UDPC 0 #define SOCKET_UDPS 1 #define ETHERNET_BUF_MAX_SIZE (1024 * 2) #define TASK_UDPC_PRIO 1 #define TASK_UDPC_STK_SIZE 256 static rt_thread_t Task_UDPC_Handler RT_NULL; void Task_UDPC(void *pvParameters); #define TASK_UDPS_PRIO 1 #define TASK_UDPS_STK_SIZE 256 static rt_thread_t Task_UDPS_Handler RT_NULL; void Task_UDPS(void *pvParameters); wiz_NetInfo default_net_info { .mac {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12}, .ip {192, 168, 1, 30}, .gw {192, 168, 1, 1}, .sn {255, 255, 255, 0}, .dns {8, 8, 8, 8}, .dhcp NETINFO_DHCP }; uint8_t dest_ip[4] {192, 168, 1, 147}; uint16_t dest_port 8080; uint8_t tcpc_ethernet_buf[ETHERNET_BUF_MAX_SIZE] {0}; uint16_t local_port 8080; uint8_t tcps_ethernet_buf[ETHERNET_BUF_MAX_SIZE] {0}; int main(void) { while (1) { rt_thread_mdelay(1); } } int app_init(void) { rt_kprintf(%s RTThread UDP example\n,_WIZCHIP_ID_); wiz_toe_init(); reg_wizchip_cris_cbfunc(rt_enter_critical,rt_exit_critical); #if DEFAULT_MAC_EN 1 getSHAR(default_net_info.mac); #endif wiz_phy_link_check(); network_init(tcpc_ethernet_buf, default_net_info); setSn_KPALVTR(SOCKET_UDPC, 6); setSn_KPALVTR(SOCKET_UDPS, 6); Task_UDPC_Handler rt_thread_create(Task UDP Client Handler, Task_UDPC, RT_NULL, TASK_UDPC_STK_SIZE, TASK_UDPC_PRIO, 20); Task_UDPS_Handler rt_thread_create(Task UDP Server Handler, Task_UDPS, RT_NULL, TASK_UDPS_STK_SIZE, TASK_UDPS_PRIO, 20); rt_thread_startup(Task_UDPC_Handler); rt_thread_startup(Task_UDPS_Handler); return 0; } INIT_APP_EXPORT(app_init); void Task_UDPC(void *parameter) { printf(UDP Client loopback\r\n); printf(Only when the destination address and port number are consistent will it be returned.\r\n); while (1) { loopback_udpc(SOCKET_UDPC, tcpc_ethernet_buf, dest_ip, dest_port); rt_thread_mdelay(1); } } void Task_UDPS(void *parameter) { printf(UDP Server loopback\r\n); printf(Data from any source will be transmitted back.\r\n); while (1) { loopback_udps(SOCKET_UDPS, tcps_ethernet_buf,local_port); rt_thread_mdelay(1); } }烧录程序后串口打印如下:双模式同时运行、互不干扰总结本文基于 W55MH32 硬件 TCP/IP 协议栈 RT-Thread 实时操作系统实现了双线程 UDP 并行通信UDP Server监听 8080接收即回传。UDP Client主动连接电脑请求 - 响应式回传。完整展示了嵌入式 UDP 开发的核心流程初始化、多线程创建、Socket 配置、数据收发、回环测试。该方案可直接用于物联网设备、数据采集、实时控制等项目。