本篇总结
在 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 处于同一网段。
- Micro USB 线连接 DEBUG USB 口到 PC(供电 + 调试串口)
- 网线连接开发板 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缓存 | 单次数据 | 测试速率 |
| 216MHz | 16KB | 2048 Byte | 6.55Mbits/s |
| 216MHz | 2KB | 2048 Byte | 5.44Mbits/s |
| 216MHz | 16KB | 512 Byte |
6.03Mbits/s |
| 72MHz | 16KB | 2048 Byte | 4.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 缓存,合理配置可显著提升吞吐量