全部例程

以太网测速示例

W55MH32

更新于 2026年9月29日

本篇总结

在 W55MH32 上借助 Jperf 图形化测速工具,通过建立无时延 TCP 客户端持续发送数据测量以太网带宽,实测可达 6.55Mbits/s。

🔑 KEIL MDK、UART调试、硬件TOE引擎、TCP、Jperf

硬件平台:本例程基于 W55MH32L-EVB 开发板运行。

采购推荐:点击前往 WIZnet 官方淘宝店铺 选购 W55MH32L-EVB

本示例演示如何在 W55MH32 上实现以太网测速功能,并通过实战例程,为大家讲解如何通过 Jperf 工具进行测速。该例程用到的其他网络协议(例如 DHCP)以及 W55MH32 的初始化过程,请参考 Network Install 章节,这里不再赘述。

前置工具准备

开始本例程前,请确认以下工具已安装:

  • WIZ UartTool V1.0:串口调试工具:点击下载
  • Jperf(含 JRE):基于 Java 的图形化网络性能测速工具,是 Iperf 的 GUI 版本:点击下载

Jperf 测试工具简介

JPerf 是基于 Java 的图形化网络性能测试工具,是 Iperf 的图形用户界面(GUI)版本,通过图形化界面让用户无需命令行操作即可完成 TCP/UDP 协议的带宽、延迟和丢包测试,支持实时性能监控,可在 Windows、Linux、macOS 跨平台运行。

  • 图形化界面:直观的 GUI 简化 Iperf 配置与运行,轻松配置测试时长、数据量、包大小等参数
  • 多协议实时监控:支持 TCP/UDP 协议,实时显示带宽、丢包率、延迟等性能数据
  • 跨平台:基于 Java,可在 Windows、Linux、macOS 运行

测速流程

安装 JRE → 安装 Jperf → 打开 jperf.bat 图形界面 → 配置工作模式与单位量程 → 对端发起测速。影响速率的关键因素包括 MCU 主频、Socket 缓存大小、单次传输数据长度及以太网差分布线。

硬件连接与拓扑

请注意:

测试需要 PC 端和 W55MH32 处于同一网段。

  1. Micro USB 线连接 DEBUG USB 口到 PC(供电 + 调试串口)
  2. 网线连接开发板 RJ45 网口 到路由器 LAN 口
┌─────────────────────────────────┐
│ 路由器(DHCP Server) │
│ 192.168.1.1 │
└────┬──────────────────┬───────────┘
│ │
┌────┴──────┐ ┌────┴──────┐
│ W55MH32 │ │ PC │
│ JPerf Clt │ │ JPerf GUI │
│ IP: DHCP │ │ IP: DHCP │
└───────────┘ └───────────┘
↑ ↑
DEBUG USB ──→ WIZ UartTool
网络拓扑:开发板与 PC 在同一局域网内,通过路由器互通

工程结构

工程位于 SDK 内 1.SDK\ModuleDemo\WZTOE\Jperf\,核心文件如下:

Jperf/
├── Project/
│   └── Project.uvprojx       ← Keil 工程文件
└── USER/
    └── main.c                ← 测速数据填充 + Socket 缓存初始化 + do_jperf() 主循环

步骤1:填充测速数据

文件:USER/main.c — 循环填充 A-Z 字符作为测速发送数据。

/* 填充测速数据:循环填充 A-Z 字符 */
for (uint16_t i = 0; i < ETHERNET_BUF_MAX_SIZE; i++)
{
    ethernet_buf[i] = 65 + i % 26;
}

测速前先将发送缓冲区 ethernet_buf 填充为 A-Z 循环字符,作为持续发送的测速数据。

步骤2:初始化 Socket 缓存

文件:USER/main.c — 为 Socket 0 分配 16KB 收发缓存,最大化单次吞吐量。

//配置socket0收发缓存为16KB
uint8_t  tx_size[_WIZCHIP_SOCK_NUM_] = {16, 0, 0, 0, 0, 0, 0, 0};
uint8_t  rx_size[_WIZCHIP_SOCK_NUM_] = {16, 0, 0, 0, 0, 0, 0, 0};
/* Set socket0 send and receive cache to 16KB */
wizchip_init(tx_size, rx_size);

将 Socket 0 的收发缓存均设为 16KB(值 16 = 16KB),通过 wizchip_init() 完成初始化。其余 Socket 缓存为 0,总缓存不超过 32KB 限制。

如果你想自定义

  • 减小缓存对比速率差异 → 将 tx_size 和 rx_size 的值改为 2(即 2KB),观察测速结果变化
  • 总缓存不超过 32KB → 8 个 Socket 缓存之和必须 ≤ 32KB

步骤3:主循环调用 do_jperf() 进行测速

文件:USER/main.c — do_jperf() 函数创建无时延模式的 TCP 客户端,连接成功后持续发送数据。

void do_jperf(uint8_t sn, uint8_t *buffer_txst, uint8_t *des_ip, uint16_t des_port)
{
  uint32_t len;
  uint16_t port = 50000;
  switch (getSn_SR(sn))
  {
  case SOCK_INIT:
      connect(sn, des_ip, des_port);
      printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, des_ip[0], des_ip[1], des_ip[2], des_ip[3], des_port);
      break;
  case SOCK_ESTABLISHED:
      if (getSn_IR(sn) & Sn_IR_CON) // Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
      {
          setSn_IR(sn, Sn_IR_CON);  // this interrupt should be write the bit cleared to '1'
          printf("%d:Connected to - %d.%d.%d.%d : %d\r\n", sn, des_ip[0], des_ip[1], des_ip[2], des_ip[3], des_port);
      }
      send(sn, buffer_txst, strlen((char *)buffer_txst)); // Data send process (User's buffer -> Destination through H/W Tx socket buffer)
      len = getSn_RX_RSR(sn);
      if (len >= sizeof(buffer_txst)) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
      {
          recv(sn, buffer_txst, len); // Data Receive process (H/W Rx socket buffer -> User's buffer)
          send(0, buffer_txst, len);
      }
      else if (len > 0)
      {
          len = recv(sn, buffer_txst, len);
          send(sn, buffer_txst, len);
      }
      break;
  case SOCK_CLOSE_WAIT:
      disconnect(sn);
      break;
  case SOCK_CLOSED:
      socket(sn, Sn_MR_TCP, port++, Sn_MR_ND);
      if (port > 60000)
      {
          port = 50000;
      }
      break;
  }
}

代码解析

该函数通过 getSn_SR(sn) 读取 Socket 状态机:SOCK_CLOSED 时以无时延模式(Sn_MR_ND)打开 TCP Socket;SOCK_INIT 时发起连接;SOCK_ESTABLISHED 时不断发送数据并回显接收数据;SOCK_CLOSE_WAIT 时断开连接。


运行验证

烧录例程运行后,首先进行 PHY 链路检测,然后打印网络地址信息,最后在未连接服务器时不断打印提示信息,直到连接上所设置的服务器为止。打开 WIZ UartTool V1.0,连接 DEBUG USB 对应 COM 口(115200 / 8N1),典型输出如下:

0:Try to connect to the 192.168.1.20 : 8080
0:Connected to - 192.168.1.20 : 8080

打开 Jperf(jperf.bat),在 PC 端配置为 Server 模式监听 8080 端口,W55MH32 作为 Client 连接后持续发送数据。下面观察不同主频、Socket 缓存以及单次发送数据对速率的影响。

MCU主频Socket缓存单次数据测试速率
216MHz16KB2048 Byte6.55Mbits/s
216MHz2KB2048 Byte5.44Mbits/s
216MHz16KB512 Byte 6.03Mbits/s
72MHz16KB2048 Byte4.34Mbits/s
JPerf 2.0 测速结果 — 216MHz / 16KB Socket 缓存 / 2048B 单次数据:6.55 Mbps
JPerf 2.0 测速结果 — 216MHz / 2KB Socket 缓存 / 2048B 单次数据:5.44 Mbps
JPerf 2.0 测速结果 — 216MHz / 16KB Socket 缓存 / 512B 单次数据:6.03 Mbps
JPerf 2.0 测速结果 — 72MHz / 16KB Socket 缓存 / 2048B 单次数据:4.34 Mbps

结论分析

主频从 72MHz 提升到 216MHz,速率提升约 51%;Socket 缓存从 2KB 增大到 16KB,速率提升约 20%;单次数据从 512B 增大到 2048B,速率提升约 9%。可见 MCU 主频对速率影响最大,其次是 Socket 缓存大小,单次传输长度影响相对较小。

常见问题

Q: 为什么必须安装 JRE 才能使用 Jperf

JPerf 是基于 Java 开发的图形化应用程序,运行依赖于 Java 运行时环境(JRE)。没有 JRE 将无法启动 jperf.bat 图形界面,因此使用前必须先安装 JRE。

Q: 如何提升 W55MH32 的测速速率

可从四个方面优化:①提升 MCU 主频(如设为 216MHz);②增大 Socket 收发缓存(如设为 16KB);③增大单次传输数据长度(如设为 2048 Byte);④保证以太网差分线布线规范,减少信号干扰。

Q: 测速时 PC 端和 W55MH32 不在同一网段怎么办

测试实例需要 PC 端和 W55MH32 处于同一网段才能正常通信。可通过修改 W55MH32 的网络地址信息(IP、子网掩码、网关)使其与 PC 端处于同一网段,或将 PC 端网卡 IP 设置到与 W55MH32 相同的网段。

Q: do_jperf 函数中无时延模式(Sn_MR_ND)有什么作用

无时延模式(Sn_MR_ND,No Delayed ACK)禁用了 TCP 的延迟确认机制,避免因等待 ACK 而造成的传输延迟,从而提升测速时的实际吞吐量。该模式下数据发送更加连续,适合带宽测试场景。

总结

  • 测速工具:借助 Jperf 图形化工具,基于 TCP 协议测量 W55MH32 以太网带宽
  • 实现步骤:填充测速数据 → 初始化 Socket 缓存(16KB)→ 主循环调用 do_jperf() 创建无时延 TCP 客户端持续发送数据
  • 关键因素:MCU 主频、Socket 缓存大小、单次传输数据长度、以太网差分线布线
  • 实测速率:216MHz + 16KB 缓存 + 2048B 单次数据可达 6.55Mbits/s
  • 优化建议:主频对速率影响最大,其次是 Socket 缓存,合理配置可显著提升吞吐量

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家