六、W5100S/W5500+RP2040树莓派Pico<UDP Server数据回环测试>

news2025/1/16 16:39:36

文章目录

  • 1. 前言
  • 2. 协议简介
    • 2.1 简述
    • 2.2 优点
    • 2.3 UDP Server的步骤
    • 2.4 应用
  • 3. WIZnet以太网芯片
  • 4. UDP Sever回环测试
    • 4.1 程序流程图
    • 4.2 测试准备
    • 4.3 连接方式
    • 4.4 相关代码
    • 4.5 测试现象
  • 5. 注意事项
  • 6. 相关链接

1. 前言

  UDP是一种无连接的网络协议,它提供了一种简单的、不可靠的方式来进行数据传输。尽管它并不保证数据传输的完整性和顺序性,但UDP在某些场景下却具有独特的优势,例如在实时应用或网络游戏等领域中。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5100S/W5500 让用户可以更加方便地在设备之间实现远程连接和通信。

2. 协议简介

2.1 简述

  UDP服务器是使用UDP协议进行通信的服务器。与TCP服务器不同,UDP服务器不需要建立连接就可以发送和接收数据报。这使得UDP服务器对于需要处理大量并发连接的应用程序更加高效。

2.2 优点

  UDP服务器的优点主要包括:

  1. 效率:UDP不需要建立连接,因此减少了建立连接的开销,使得数据传输速度更快。
  2. 实时性:UDP适用于对实时性要求较高的应用,因为它能够更快速地传输数据。
  3. 广播和多播传输:UDP可以实现广播和多播传输,这意味着一个消息可以被发送到多个或所有目标。
  4. 简单性:UDP协议相对简单,易于理解和实现。

2.3 UDP Server的步骤

  创建一个UDP服务器通常涉及以下步骤:
在这里插入图片描述

  1. 创建一个socket:这通常使用系统调用(如socket())完成。
  2. 绑定地址和端口:通过将socket与本地IP地址和端口号绑定,为服务器选择一个监听的位置。
  3. 开始监听:通过调用bind()函数将socket与本地地址和端口号绑定,然后使用recvfrom()函数开始监听来自客户端的数据报。
  4. 处理数据报:当接收到数据报时,服务器可以使用sendto()函数将响应发送回客户端。
  5. 关闭socket:最后,关闭socket以释放系统资源。

2.4 应用

UDP服务器被广泛应用于各种应用场景,以下是一些常见的应用:

  1. 实时通信:UDP因其快速传输数据的特性,广泛应用于实时通信,如实时股票交易系统、实时行情系统、实时报价系统等。
  2. 网络游戏:网络游戏对实时性和流畅性有很高的要求,UDP协议能够提供更快的速度和更少的延迟,因此在网络游戏中被广泛使用。
  3. 音视频传输:音视频传输对实时性和流畅性有很高的要求,UDP协议能够提供更快的速度和更少的延迟,因此在音视频传输中被广泛使用。
  4. 物联网:在物联网领域,UDP因其简单、快速和高效的特点,被广泛应用于各种设备的通信。
  5. 日志收集:许多服务器使用UDP来发送日志数据,因为UDP能够提供更快的传输速度,并且对数据包的顺序和完整性没有严格要求。

3. WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

4. UDP Sever回环测试

4.1 程序流程图

在这里插入图片描述

4.2 测试准备

软件

  • Visual Studio Code
  • WIZnet UartTool
  • SocketTester

硬件

  • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • TTL 转 USB
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
  • 通过TTL串口转USB,连接UART0 的默认引脚:
    • RP2040 GPIO 0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO 1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040进行连线时
    • RP2040 GPIO 16 <----> W5100S MISO
    • RP2040 GPIO 17 <----> W5100S CS
    • RP2040 GPIO 18 <----> W5100S SCK
    • RP2040 GPIO 19 <----> W5100S MOSI
    • RP2040 GPIO 20 <----> W5100S RST
  • 通过网线直接连接PC网口(或:PC和设备都通过网线连接交换机或路由器LAN口)

4.4 相关代码

  我们直接打开udp_server.c文件(路径:examples/udp_client/udp_client.c)看下具体实现:

  可以看到这里是以DHCP模式配置网络信息的,因此在主控和W5100S初始化完成后,会进行DHCP初始化,然后增加一个定时器初始化,用来做DHCP过程中的计时以进行超时处理;接着进入DHCP配置网络信息,成功则直接进入循环调用回环测试函数,失败则用我们初始化的静态网络信息进行配置,然后再进入循环调用回环测试函数,如下所示:

/* Network information to be configured. */
wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address
    .ip = {192, 168, 1, 10},                     // Configured IP address
    .sn = {255, 255, 255, 0},                    // Configured subnet mask
    .gw = {192, 168, 1, 1},                      // Configured gateway
    .dns = {8, 8, 8, 8},                         // Configured domain address
    .dhcp = NETINFO_DHCP};                       // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.

wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
    0,
};                                           // Send and receive cachestatic uint8_t destip[4]={192, 168, 1, 2};  // udp destination ip
static uint8_t des_ip[4] = {192, 168, 1, 2}; // UDP IP address
static uint16_t des_port = 8080;             // UDP port
static uint8_t dhcp_get_ip_flag = 0;         // Define the DHCP acquisition flag

int main()
{
    struct repeating_timer timer; // Define the timer structure

    /* MCU init */
    stdio_init_all();     // Initialize the main control peripheral
    wizchip_initialize(); // Initialize the chip interface

    /*dhcp init*/
    DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initialization
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler

    printf("wiznet chip tcp server example.\r\n");
    network_init(&net_info);              // Configuring Network Information
    print_network_information(&get_info); // Read back the configuration information and print it

    while (true)
    {
        loopback_udpc(SOCKET_ID, ethernet_buf, des_ip, des_port); // udp loopback test
    }
}

  跳进回环测试里面看下其具体实现:该函数有这几个参数,socket端口号、数据收发缓存、目标IP地址、目标端口;可根据需要自行填入参数。其整体通过一个switch状态机轮询socket状态,根据不同进行相应的处理,依次完成了初始化、打开socket端口、收到数据后回传的操作;其中本地端口直接在函数内初始化了。如下所示:

/**
 * @brief   udp client loopback test
 * @param   sn:         socket number
 * @param   buf:        Data sending and receiving cache
 * @param   destip:     Destination IP address
 * @param   destport:   Destination port
 * @return  value for SOCK_ERRORs,return 1:no error
*/
int32_t loopback_udpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
{
   int32_t ret;
   uint16_t size = 0, sentsize=0;

   static uint16_t any_port = 50000;

   switch(getSn_SR(sn))
   {
      case SOCK_UDP :
         // sendto(sn, "test", 4, destip, destport);
         if((size = getSn_RX_RSR(sn)) > 0)
         {
            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
            ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
            buf[ret]=0x00;
            printf("recv form[%d.%d.%d.%d][%d]: %s\n", destip[0],destip[1],destip[2],destip[3],destport,buf);
            if(ret <= 0)
            {
#ifdef _LOOPBACK_DEBUG_
               printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
               return ret;
            }
            size = (uint16_t) ret;
            sentsize = 0;
            while(sentsize != size)
            {
               ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
               if(ret < 0)
               {
#ifdef _LOOPBACK_DEBUG_
                  printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
                  return ret;
               }
               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
            }
         }
         break;
      case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
         //printf("%d:UDP loopback start\r\n",sn);
#endif
         if((ret = socket(sn, Sn_MR_UDP, any_port, 0x00)) != sn)
            return ret;
#ifdef _LOOPBACK_DEBUG_
         printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, any_port);
#endif   
         break;
      default :
         break;
   }
   return 1;
   
}

4.5 测试现象

  硬件连接无误后,编译烧录程序(具体可参考第一章节),打开WIZ UartTool,选择对应的COM口,填入参数:波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开,观察串口打印的信息以获取设备运行状态;打开SocketTester,在左列填入相对应的参数,UDP 模式,本地IP填写电脑的IP,本地端口的填写可随机,但尽量不要使用特殊端口;然后根据设备通过DHCP获得的IP等信息,在下边远程IP地址栏填入设备IP和设备端口,因为UDP是无连接的,直接发送信息后可以看到回传现象,如下图所示:

在这里插入图片描述

5. 注意事项

  • UDP是无连接的,服务端发送消息后客户端收到才能看到现象
  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:
  1. 在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500;
  2. 在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

6. 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

想了解更多,评论留言哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1154362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MS-NAS

方法 作者未提供代码

EtherCAT的4种寻址方式解析

我们知道&#xff0c;一个EtherCAT数据帧&#xff08;frame&#xff09;里面包含很多个报文&#xff08;datagram&#xff09;&#xff0c;不管是什么样式的报文&#xff0c;它们的目的只有一个&#xff0c;就是读写从站寄存器或内存。所以寻址就是以什么方式访问哪个从站的哪个…

剑指offer(C++)-JZ5:替换空格(算法-其他)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 请实现一个函数&#xff0c;将一个字符串s中的每个空格替换成“%20”。 例如&#xff0c;当字符串为We A…

Mybatis执行流程简析

一、前言 日常工作中&#xff0c;我们用到mybatis的时候&#xff0c;都是写一个Mapper接口xml文件/注解形式&#xff0c;然后就可以在业务层去调用我们在Mapper接口中定义的CRUD方法&#xff0c;很方便&#xff0c;但一直都没有去研究过执行逻辑&#xff0c;下面附一篇我自己研…

在NISQ小型计算机上执行大型并行量子计算的可能性

简介 Steve White提出了密度矩阵重整化群&#xff08;DMRG&#xff09;的基本思想&#xff0c;即纠缠是一种有价值的资源&#xff0c;可以用来精确或近似地描述大量子系统。后来&#xff0c;这一思想被理解为优化矩阵积状态&#xff08;MPS&#xff09;的算法&#xff0c;支持…

组件与Props:React中构建可复用UI的基石

目录 组件&#xff1a;构建现代UI的基本单位 Props&#xff1a;组件之间的数据传递 Props的灵活性&#xff1a;构建可配置的组件 组件间的通信&#xff1a;通过回调函数传递数据 总结&#xff1a; 组件&#xff1a;构建现代UI的基本单位 组件是前端开发中的关键概念之一。…

氮化镓功率HEMT的表征与建模

来源&#xff1a;Characterization and Modeling of a Gallium Nitride Power HEMT(IEEE TRANSACTIONS ON INDUSTRY APPLICATIONS) GaN high-electron-mobility transistor (HEMT) GaN高电子迁移率晶体管   该模型包括一个电压相关电流源Ids、两个电压相关电容Cgd和Cds、一…

UG\NX二次开发 球坐标到直角坐标的转换

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 JiaLiHuiNaoGui 订阅本专栏,非常感谢。 简介 已知角度θ和ϕ,距离d,求P点坐标。 "> 代码 #include "me.hpp" using namespace NXOpen; using namespace std;void GetP<

汽车贴膜店展示服务预约小程序的作用是什么

很多家庭都有车辆&#xff0c;除了车身自带颜色或外观&#xff0c;部分消费者会选择贴车衣、改色膜以及其它装饰类服务&#xff1b;而市场高需求下也促进了商家生意增长。 但随着线上化程度加深&#xff0c;传统线下门店也面临多重困境&#xff0c;品牌需要线上发展获得生意及…

loadsh

官网&#xff08;当前版本4.x&#xff09;Lodash Documentationhttps://lodash.com/docs/4.17.15 简介 Lodash是一个著名的javascript原生库&#xff0c;不需要引入其他第三方依赖。是一个意在提高开发者效率,提高JS原生方法性能的JS库。简单的说就是&#xff0c;很多方法loda…

WorkPlus:领先的IM软件,助力企业高效沟通与协作

随着信息技术的发展&#xff0c;企业内部沟通协作变得至关重要&#xff0c;而IM&#xff08;即时通讯&#xff09;软件成为了企业中不可或缺的工具。在众多IM软件中&#xff0c;WorkPlus凭借其卓越的功能和优质的用户体验&#xff0c;成为了企业首选。 WorkPlus为何备受企业青睐…

一文弄懂Linux信号机制

目录 1.什么是信号&#xff1f; 2.信号实现原理 ​3.信号生命周期 4.信号分类 5.信号常见概念 6.信号阻塞和信号忽略的区别&#xff1f; 1.什么是信号&#xff1f; Linux信号机制是进程间通信的一种方式&#xff0c;用于在不同进程之间传递信息。它通过向目标进程发送一…

图片加水印怎么加?

图片加水印怎么加&#xff1f;一般我们给图片加水印都会使用一些工具来进行的。很多常见的 作图工具都有给图片加水印的功能呢。图片加水印是一种常见的图像处理技术&#xff0c;可以在图片上添加一些标识、文字或图形&#xff0c;以保护图片的版权&#xff0c;或者用于品牌宣传…

在Maven中发布项目到Nexus私有服务器

一、测试环境 Sonatype Nexus 3.61.0-02 Maven 3.9.2 二、环境配置 2.1找到maven的配置文件 2.2添加私有仓库账户密码 <servers><server><id>nexus</id><username>admin</username><password>admin</password></server&…

批量预处理哨兵2影像

批量预处理哨兵2影像 最近下载70多景哨兵2影像&#xff0c;平均每个影像在cmd中处理时间都需要半个小时。算下来我一景一景手动处理需要37个小时左右&#xff0c;每天在电脑前待8个小时也要4天多&#xff0c;很浪费时间。如果能够批处理&#xff0c;不需要我手动做的话&#x…

作为开发者如何有效使用 ChatGPT(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

基于EasyCVR技术的大数据视频汇聚与智能分析平台设计方案

一、背景需求 大数据中心的数据建设如火如荼&#xff0c;针对其中城市中的视频监管及算法分析&#xff0c;各卡口监控、治安监控&#xff0c;电警监控不同网络、不同地域&#xff0c;如何进行视频融合、进行统一监管&#xff0c;则是大数据中心解决方案数据汇聚的重中之重。 现…

java判断上午下午的方法

一、代码 import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale;public class Main1 {public static void main(String[] args) {Date nowDate new Date();SimpleDateFormat sdf new SimpleDateFormat("aa", Locale.ENGLISH);Strin…

流程图用什么软件做?这4款软件不容错过

流程图是管理者用于管理的一种方式&#xff0c;它能够让管理者详细地知道工作中&#xff0c;哪个环节出了问题&#xff0c;从而针对问题&#xff0c;确定可实施的方案。因此&#xff0c;如何制作出一个完整流畅的流程图&#xff0c;是所有管理者都在思考的问题&#xff0c;小编…

安装Python环境

Python 安装包下载地址&#xff1a;https://www.python.org/downloads/ 打开该链接&#xff0c;可以看到有两个版本的 Python&#xff0c;分别是 Python 3.x 和 Python 2.x&#xff0c;如下图所示&#xff1a; Python下载页面截图 图 1 Python 下载页面截图&#xff08;包含…