全部例程

W55MH32-iperf3测速

W55MH32

更新于 2026年2月5日

iperf3 测试工具简介

iperf3 是跨平台、开源免费的专业网络性能测试工具,支持 TCP/UDP 协议,可精准测量带宽、丢包率等核心指标,通过简单命令行即可启动测试,支持 Windows、Linux 操作系统,并可与 W55MH32 嵌入式芯片进行数据交互,能直观反映嵌入式以太网设备通信性能,为硬件验证、固件优化提供可靠量化数据,是网络调试与性能评估的高效工具。

iperf3特点

  • 双协议速率采集:支持 TCP、UDP 协议测试,可精准测量带宽吞吐率。

  • 轻量易用高效:支持 Windows、Linux、Mac 等桌面系统,同时适配 ARM/STM32 等嵌入式平台,完美契合嵌入式以太网设备性能测试场景。

  • 跨平台兼容:无图形化冗余操作,仅通过简单命令行指令即可启动测试,无需复杂配置,新手也能快速上手完成测试。

  • 开源精准可靠:基于 BSD 开源协议免费使用,无版权限制,测试结果贴合实际网络传输场景,为网络调试、硬件验证提供量化数据支撑。

影响速率的几点原因

  • MCU主频

  • Socket缓存大小

  • 单次传输数据长度

以太网测数流程

1.打开iperf3,例程文件夹里有程序

 

2.进入文件夹,在上方地址栏输入cmd,打开命令行窗口

 

3.目前已经打开iperf3文件夹的cmd窗口

 

4.接下来我们配置W55MH32端

实现过程

接下来,我们在W55MH32上实现以太网测速功能。

步骤1:设置W55MH32和电脑的基本网络参数,使其处于同一网段内


/* network information */
wiz_NetInfo default_net_info = {
    .mac  = {0x00, 0x08, 0xdc, 0x12, 0x22, 0x12}, //User-defined MAC address
    .ip   = {192, 168, 2, 30},
    .gw   = {192, 168, 2, 1},
    .sn   = {255, 255, 255, 0},
    .dns  = {8, 8, 8, 8},
    .dhcp = 1
};

uint8_t  ethernet_buf_tx[ETHERNET_BUF_MAX_SIZE] = {0};
uint8_t  ethernet_buf_rx[ETHERNET_BUF_MAX_SIZE] = {0};
uint8_t  dest_ip[4]                          = {192, 168, 2, 44};
uint16_t dest_port                           = 8080;

步骤2:初始化socket缓存

uint8_t  tx_size[_WIZCHIP_SOCK_NUM_]         = {8, 8, 0, 0, 0, 0, 0, 0};
uint8_t  rx_size[_WIZCHIP_SOCK_NUM_]         = {8, 8, 0, 0, 0, 0, 0, 0};

步骤3:主循环

while (1)
{
      stats_init(&stats, 1000);
    socket_status = getSn_SR(SOCKET_CTRL);
    if (socket_status == SOCK_ESTABLISHED)
    {
        handle_param_exchange(SOCKET_CTRL, &reverse, &udp);
        handle_create_streams(SOCKET_CTRL, udp, remote_ip, &remote_port);

        start_iperf_test(SOCKET_CTRL, SOCKET_DATA, &stats, reverse, udp, remote_ip, &remote_port);
        close(SOCKET_DATA);
        disconnect(SOCKET_CTRL);
    }
    else if (socket_status == SOCK_CLOSE_WAIT)
    {
        disconnect(SOCKET_CTRL);
    }
    else if (socket_status == SOCK_CLOSED)
    {
        socket(SOCKET_CTRL, Sn_MR_TCP, PORT_IPERF, Sn_MR_ND);
        listen(SOCKET_CTRL);
        printf("The iperf3 test is ready. Please enter the following command for testing:\r\n");
        printf("The iperf3 test is ready. Please enter the following command for testing:\r\n");
        printf("TCP RX: iperf3 -c %d.%d.%d.%d -p 5007\r\n",net_info.ip[0],net_info.ip[1],net_info.ip[2],net_info.ip[3]);
        printf("TCP TX: iperf3 -c %d.%d.%d.%d -p 5007 -R\r\n",net_info.ip[0],net_info.ip[1],net_info.ip[2],net_info.ip[3]);
        printf("UDP RX: iperf3 -c %d.%d.%d.%d -p 5007 -u -b 100M -l 4000\r\n",net_info.ip[0],net_info.ip[1],net_info.ip[2],net_info.ip[3]);
        printf("UDP TX: iperf3 -c %d.%d.%d.%d -p 5007 -u -b 100M -R\r\n",net_info.ip[0],net_info.ip[1],net_info.ip[2],net_info.ip[3]);
    }
}
}

核心代码:接收前序协商的测试参数(TCP/UDP/ 接收 / 发送),通过独立的控制 / socket完成测速数据的高速收发,实时统计传输字节数、吞吐量等核心数据,响应客户端启停指令,最终将标准化测速结果回传客户端,是实现网络速率精准测试的核心环节。

void start_iperf_test(uint8_t socket_ctrl, uint8_t socket_data, Stats *stats, bool reverse, bool udp, uint8_t *remote_ip, uint16_t *remote_port)
{
    bool     running     = true;
    uint8_t  cmd         = 0;

    uint32_t pack_len    = 0;
    uint16_t sent_size, recv_size;

    printf("[iperf] Starting data stream test...\n");

    // Start test
    cmd = TEST_START;
    send(socket_ctrl, &cmd, 1);

    // Running test
    cmd = TEST_RUNNING;
    send(socket_ctrl, &cmd, 1);

    stats_start(stats);

    while (running)
    {
        if (getSn_RX_RSR(SOCKET_CTRL) > 0)
        {
            recv(SOCKET_CTRL, &cmd, 1);
            if (cmd == TEST_END)
            {
                printf("[iperf] TEST_END command received. Stopping test...\n");
                running = false;
                break;
            }
        }
        if (reverse)
        {
            if(udp)
            {
                sent_size = sendto(socket_data, ethernet_buf_tx, ETHERNET_BUF_MAX_SIZE, remote_ip, *(remote_port));
            }
            else
            {
                sent_size = send(socket_data, ethernet_buf_tx, ETHERNET_BUF_MAX_SIZE / 2);
            }
            stats_add_bytes(stats, sent_size);
        }
        else
        {
            getsockopt(socket_data, SO_RECVBUF, &pack_len);
            if (pack_len > 0)
            {
                if(udp)
                {
                    recv_size = recvfrom(socket_data, (uint8_t *)ethernet_buf_rx, ETHERNET_BUF_MAX_SIZE, remote_ip, remote_port); // more fast
                }
                else
                {
                    recv_size = recv(socket_data, (uint8_t *)ethernet_buf_rx, ETHERNET_BUF_MAX_SIZE); // more fast
                }
                stats_add_bytes(stats, recv_size);
            }
            else if (pack_len == 0)
            {
                stats_update(stats, false);
            }
            else
            {
                printf("[iperf] Error during data reception\n");
                break;
            }
        }
        stats_update(stats, false);
    }
    stats_stop(stats);

    exchange_results(SOCKET_CTRL, stats);
}

运行结果

1.烧录例程运行后,首先进行了PHY链路检测,然后打印网络地址信息,最后打印iperf3命令行。

注意:此时要关闭防火墙。

2.接着我们把打印出来的第一条指令iperf3 -c 192.168.2.30 -p 5007复制到电脑的命令行窗口,然后点击回车,开始进行TCP接收测试。此时可以看到命令行窗口和串口显示器上都打印出了测试结果,测试结果显示W55MH32的TCP接收速率约为27.9Mbps。

3.接着我们把打印出来的第二条指令iperf3 -c 192.168.2.30 -p 5007 -R复制到电脑的命令行窗口,然后点击回车,开始进行TCP发送测试。此时可以看到命令行窗口和串口显示器上都打印出了测试结果,测试结果显示W55MH32的TCP发送速率约为22.8Mbps。

4.然后我们把打印出来的第三条指令iperf3 -c 192.168.2.30 -p 5007 -u -b 100M复制到电脑的命令行窗口,然后点击回车,开始进行UDP接收测试。此时可以看到命令行窗口和串口显示器上都打印出了测试结果,测试结果显示W55MH32的UDP接收速率约为21.8Mbps。

5.最后我们把打印出来的第四条指令iperf3 -c 192.168.2.30 -p 5007 -u -b 100M -R -l 8192复制到电脑的命令行窗口,然后点击回车,开始进行UDP发送测试。此时可以看到命令行窗口和串口显示器上都打印出了测试结果,测试结果显示W55MH32的UDP发送速率约为24.5Mbps。

总结

本文以 W55MH32 芯片为核心,详解了通过 iperf3 工具开展以太网测速的实操方案:涵盖 iperf3 工具特性、测速关键影响因素,以及嵌入式端网络配置、代码实现、命令行测试等核心步骤。实测验证了 W55MH32 在 TCP/UDP 协议下的收发速率表现,所提供的完整例程与测试流程,可高效支撑 W55MH32 以太网性能验证与调试优化。

下载本章例程

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

开发环境: Keil 配套开发板