Ethernet Rate Test
本篇文章我们将详细介绍如何在W55MH32芯片上面实现太网测速功能,并通过实战例程,为大家讲解如何通过Jperf工具进行测速。 该例程用到的其他网络协议,例如DHCP,有关W55MH32的初始化过程,请参考Network install章节,这里将不再详述。
Jperf简介
JPerf 是一个基于 Java 的图形化网络性能测试工具,它是 Iperf(一个常用的网络性能测试工具)的图形用户界面(GUI)版本。Iperf 是一个流行的开源工具,广泛用于网络带宽、 延迟和丢包等性能指标的测试,而 JPerf 则通过图形化界面让用户更加方便地进行这些测试,而无需通过命令行操作。
Jperf特点
- 图形化界面:JPerf 提供一个直观的用户界面,简化了 Iperf 配置和运行过程,使得用户可以更加轻松地进行网络性能测试。
- 支持多种协议: JPerf 支持 TCP 和 UDP 协议,允许用户在测试过程中选择不同的协议来模拟不同类型的网络负载。
- 实时性能监控: JPerf 能够实时显示网络性能数据(如带宽、丢包率、延迟等),帮助用户分析网络状况。
- 易于配置:用户可以通过图形化界面轻松配置测试参数,如测试时长、传输数据量、数据包大小等。
- 跨平台:作为 Java 应用程序,JPerf 可以在多种操作系统平台上运行,包括 Windows、Linux 和 macOS。
影响速率的几点原因
- MCU主频
- Socket缓存大小
- 单次传输数据长度
- 以太网差分线布线
以太网测速流程
实现过程
接下来,我们在W55MH32上实现以太网测速功能。
步骤1:填充测速数据
for (uint16_t i = 0; i < ETHERNET_BUF_MAX_SIZE; i++)
{
ethernet_buf[i] = 65 + i % 26;
}
步骤2:初始化socket缓存
//配置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);
步骤3:主循环调用do_jperf()函数进行测速测试
do_jperf()函数如下:
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;
}
}
do_jperf()函数创建了一个无时延模式的TCP客户端,在成功连接上服务器之后则不断发送数据。
运行结果
请注意:
测试实例需要PC端和W55MH32处于同一网段。
烧录例程运行后,首先进行了PHY链路检测,然后打印网络地址信息,最后在未连接服务器时,不断打印提示信息,直到连接上所设置的服务器为止:

接下来,我们看看不同主频、socket缓存以及单次发送数据对速率的影响:
主频:216MHz
socket收发缓存:16KB
单次数据:2048 Byte
测试速率为:6.55Mbits/s

主频:216MHz
socket收发缓存:2KB
单次数据:2048 Byte
测试速率为:5.44Mbits/s

主频:216MHz
socket收发缓存:16KB
单次数据:512 Byte
测试速率为:6.03Mbits/s

主频:72MHz
socket收发缓存:16KB
单次数据:2048 Byte
测试速率为:4.34Mbits/s

总结
本文讲解了如何在 W55MH32 芯片上实现以太网测速功能,通过实战例程展示了借助 Jperf 工具进行测速的具体过程,包括填充测速数据、初始化 socket 缓存以及在主循环中调用函数进行测试等步骤。
下一篇文章将聚焦在 W55MH32 芯片上实现 Modbus TCP 协议,解析 Modbus TCP 协议的核心原理及在工业通信中的应用, 同时通过实战例程讲解如何在 W55MH32 上搭建 Modbus TCP 服务器,实现与客户端的通信,敬请期待!