当前位置: 首页 > news >正文

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

文章目录

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

1. 前言

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

  本章将在UDP Client模式下进行数据回环测试。

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

2. 协议简介

2.1 简述

  UDP是Open System Interconnection(开放式系统互联)参考模型中一种无连接的传输层协议,它提供面向事务的简单不可靠信息传送服务。UDP在IP报文的协议号是17。与传输控制协议(TCP)相对,UDP是一种无连接的、不可靠的协议,它提供了简单的数据传输服务。

  UDP协议不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用,包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。

  总的来说,虽然UDP不具备可靠性和流量控制等特性,但由于其低开销和高传输效率,使得UDP在音视频传输、实时通信等领域得到广泛应用。

2.2 优点

  • 简单性:UDP的协议结构相对简单,这使得其在实现和使用上较为方便,对于某些简单数据传输任务来说,UDP可以更快地完成。
  • 高效性:UDP的数据报文头部开销较小,相对于TCP来说,其数据传输效率较高。在处理大数据量的情况下,UDP可以更好地利用网络带宽。
  • 实时性:UDP支持实时应用,例如视频会议和在线游戏等。这是因为UDP协议不提供数据包的分组、组装和排序功能,而是更注重速度和效率。
  • 应用广泛:由于UDP的简单和高效率,使其在许多网络管理任务、网络测试和实时多媒体应用中得到广泛应用。

2.3 应用

  • 实时通信:如网络游戏、在线直播、VoIP(网络电话)等,需要实时传输音频、视频等数据流,通过UDP协议实现高效、实时的数据传输。
  • DNS查询:DNS(域名系统)使用UDP协议进行地址查询,因为UDP不需要建立连接,可以减少查询时间。
  • TFTP:文件传输协议TFTP(简单文件传输协议)使用UDP协议进行文件传输,因为它不需要建立连接,可以实现快速传输。
  • SNMP:网络管理协议SNMP(简单网络管理协议)使用UDP协议进行网络设备管理,因为UDP可以实现简单的请求和响应。
  • BOOTP:网络启动协议BOOTP(引导程序协议)使用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 Client回环测试

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_client.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 flagint main()
{struct repeating_timer timer; // Define the timer structure/* MCU init */stdio_init_all();     // Initialize the main control peripheralwizchip_initialize(); // Initialize the chip interface/*dhcp init*/DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initializationadd_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handlerprintf("wiznet chip tcp server example.\r\n");network_init(&net_info);              // Configuring Network Informationprint_network_information(&get_info); // Read back the configuration information and print itwhile (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);
#endifreturn 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);
#endifreturn 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);
#endifif((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官方库链接

本章例程链接

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

相关文章:

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

文章目录 1. 前言2. 协议简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP Client回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP是一种无连接的网络协议&#xff0c;它提供了一种简单的、不可靠的方式来…...

死锁Deadlock

定义 死锁是指两个或多个线程互相持有对方所需的资源&#xff0c;从而导致它们无法继续执行的情况。如下图所示&#xff0c;现有两个线程&#xff0c;分别是线程A及线程B&#xff0c;线程A持有锁A&#xff0c;线程B持有锁B。此时线程A想获取锁B&#xff0c;但锁B需等到线程B的结…...

【spark客户端】Spark SQL CLI详解:怎么执行sql文件、注释怎么写,支持的文件路径协议、交互式模式使用细节

文章目录 一. Spark SQL Command Line Options(命令行参数)二. The hiverc File1. without the -i2. .hiverc 介绍 三. 支持的路径协议四. 支持的注释类型五. Spark SQL CLI交互式命令六. Examples1. running a query from the command line2. setting Hive configuration vari…...

虹科干货 | HK-TrueNAS版本大揭秘!一文教您如何选择合适的TrueNAS软件

文章来源&#xff1a;虹科网络基础设施 阅读原文&#xff1a;https://mp.weixin.qq.com/s/Iv0zDDmiDgE9vEGlAZs-sg 1&#xff0e;导语 TrueNAS是虹科iXsystems 设计和开发的NAS 操作系统&#xff0c;提供许多功能&#xff0c;例如文件存储、虚拟机 (VM) 和媒体服务器。它基于…...

前端html+css+js实现的2048小游戏,很完善。

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 逻辑用的是JavaScript&#xff0c;界面用canvas实现&#xff0c;暂时还没有添加动画。 视频浏览地址...

学习通签到

要在Vue中使用H5lock.js&#xff0c;首先需要将H5lock.js引入到项目中。可以通过以下步骤来使用&#xff1a; 1. 将H5lock.js文件保存到项目中的某个目录下&#xff0c;例如src/assets文件夹。 2. 在需要使用H5lock.js的组件中&#xff0c;通过import语句将H5lock.js引入进来…...

target采退、测评养号购物下单操作教程

1.点击右上角的Create account注册账号 2.填写账号信息 3. 进入自己需要购买的商品页面 点击pick it up购买 4. 进入购物车页面选择快递方式和地址后点击 check out按钮 5. 之后会提示绑定XYK&#xff0c;这里我是用虚拟XYK开卡平台进行支付的. 6. 确认订单无误后点击Place you…...

SEACALL海外呼叫中心系统的优势包括

SEACALL海外呼叫中心系统的优势包括 封卡封号问题解决 海外呼叫中心系统通过API开放平台能力&#xff0c;定制电话营销系统&#xff0c;提供多项功能如自动拨打、智能应答、真人语音交互等&#xff0c;帮助企业克服员工离职率高、客户资源流失严重等挑战。 - 高级管理者操控 …...

Painter:使用视觉提示来引导网络推理

文章目录 1. 论文2. 示意图3. 主要贡献4. 代码简化 1. 论文 paper:Images Speak in Images: A Generalist Painter for In-Context Visual Learning github:https://github.com/baaivision/Painter 2. 示意图 3. 主要贡献 在 In-context Learning 中&#xff0c;作为自然语言…...

Fedora Linux 38 安装数学动画制作工具manimgl工具包

manimgl可以制作数学动画&#xff0c;它使用的是Python编程语言。 这里介绍他在Fedora Linux 38下的安装过程。 1. sudo dnf update 2. sudo dnf install python3-devel python3-pip python3-tools -y 3. sudo dnf install python3-numpy python3-scipy python3-sympy -y …...

行业追踪,2023-10-26

自动复盘 2023-10-26 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…...

Android 和 iOS APP 测试的那些区别

目前市面上主流的移动操作系统就是 Android 和 iOS 两种&#xff0c;移动端测试本身就跟 Web 应用测试有自己的专项测试&#xff0c;比如安装、卸载、升级、消息推送、网络类型测试、弱网测试、中断测试、兼容性测试等都是区别于 Web 应用需要关注的测试领域。 那么&#xff0…...

利用nicegui开发ai工具示例

from fastapi import FastAPI import uvicorn from nicegui import uiclass PipRequirement:def __init__(self):ui.label("依赖安装与依赖展示")class BasicSettings:def __init__(self):self.project_select ui.select(["test"], label"项目选择&q…...

HarmonyOS鸿蒙原生应用开发设计- 流转图标

HarmonyOS设计文档中&#xff0c;为大家提供了独特的流转图标&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的流转图标内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的图标侵权意外情况等&#xff0c;减…...

postgresql14管理(六)-备份恢复

定义 备份&#xff08;backup&#xff09;&#xff1a;通过物理复制或逻辑导出的方式&#xff0c;将数据库的文件或结构和数据拷贝到其他位置进行存储&#xff1b; 还原&#xff08;restore&#xff09;&#xff1a;是一种不完全的恢复。使用备份文件将数据库恢复到备份时的状…...

配置Sentinel 控制台

1.遇到的问题 服务网关 | RuoYi 最近调试若依的微服务版本需要用到Sentinel这个组件&#xff0c;若依内部继承了这个组件连上即用。 Sentinel是阿里巴巴开源的限流器熔断器&#xff0c;并且带有可视化操作界面。 在日常开发中&#xff0c;限流功能时常被使用&#xff0c;用…...

【漏洞复现】酒店宽带运营系统RCE

漏洞描述 安美数字 酒店宽带运营系统 server_ping.php 远程命令执行漏洞 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff…...

Autojs 利用OpenCV识别棋子之天天象棋你马没了

本例子通过代码像你介绍利用OpenCV实现霍尔找圆的方法定位棋子位置 通过autojs脚本实现自动点击棋子 开源地址 https://github.com/Liberations/TtxqYourHorseIsGone/blob/master/main.js AutoXJs https://github.com/kkevsekk1/AutoX/releasesauto() //安卓版本高于Android 9…...

好数组——尺取法

好数组 给定一个长度为 n 的数组 a&#xff0c;计算数组 a 中所有子数组中好数组的数目。 好数组定义如下&#xff1a; 对于数组 al ,al1, ⋯ ,ar &#xff0c;若数组中所有数的质因数种类数不超过 k&#xff0c;则称为好数组。 Input 输入的第一行包含两个正整数 n,k (1≤…...

【Linux】Ubuntu升级nodejs版本

在下载nvm对nodejs版本进行管理时&#xff0c;由于网络因素一直下载失败&#xff0c;于是采用了新的方法对nodejs版本进行升级。 首先我们先查询一下现存的nodejs版本号&#xff0c;发现是12 我们下载一个名为n的软件包&#xff0c;n 是一个非常方便的 Node.js 版本管理工具&am…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...