全部例程

Ethernet Rate Test

W55MH32 其他标签

2025/02/12 更新

本篇文章我们将详细介绍如何在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缓存大小
  • 单次传输数据长度
  • 以太网差分线布线

以太网测速流程

  1. 安装Jre
  2. 安装Jperf
  3. 打开jperf图形界面

    请注意:

    必须安装Jre才支持打开图形化界面。

    jperf.bat位于Jperf安装目录下:

  4. 配置工作模式以及单位量程:
  5. 对端发送数据开始测速。

实现过程

接下来,我们在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 服务器,实现与客户端的通信,敬请期待!

下载本章例程

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

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