一、问题现象
-  终端输入无响应 - 启动iperf服务器后,终端被阻塞,无法输入其他命令(如图中重复输出日志覆盖输入区域)。
- 直接原因:iperf_server线程未正确处理退出标志,导致select或accept长期阻塞。
 
- 启动
-  重复绑定端口日志 - 终端频繁输出本地端口号是5001,表明:- 服务器套接字未正确关闭,重复初始化。
- 端口被其他进程占用(可能因异常退出导致)。
 
 
- 终端频繁输出
-  无法通过 iperf --stop终止服务- 全局标志param.mode未触发线程退出循环。
 
- 全局标志
二、根本原因
-  代码逻辑缺陷 - iperf_server中- select调用阻塞时间过长(默认3秒),未及时检测退出标志。
- 未强制关闭套接字,导致线程卡在accept或select。
 
-  资源未释放 - 异常退出时,套接字未关闭,端口未释放,重启时触发bind错误。
 
- 异常退出时,套接字未关闭,端口未释放,重启时触发
-  终端配置问题 - MobaXterm未启用本地回显(Local Echo),输入内容被日志覆盖。
 
三、解决方案
1. 代码修复(关键修改)
// 修改iperf_server循环逻辑
void iperf_server(void *thread_param) {struct timeval timeout;timeout.tv_sec = 1;  // 缩短超时时间至1秒while (param.mode != IPERF_MODE_STOP) {// 每次循环重置超时timeout.tv_sec = 1;FD_SET(sock, &readset);ret = select(sock + 1, &readset, NULL, NULL, &timeout);if (ret == -1 || param.mode == IPERF_MODE_STOP) break;  // 及时退出// 处理连接...}// 强制关闭套接字(避免阻塞)if (sock >= 0) {shutdown(sock, SHUT_RDWR);closesocket(sock);}
}2. 命令行操作
| 操作 | 命令 | 说明 | 
|---|---|---|
| 启动服务器 | iperf -s -p 5001 & | &后台运行,避免阻塞终端 | 
| 停止服务器 | iperf --stop或killall iperf | 全局标志触发退出或强制终止进程 | 
| 验证端口监听 | `netstat -an | grep 5001` | 
3. MobaXterm配置
-  启用本地回显 - 右键终端 → Settings → Terminal → 勾选: - ✅ Local echo
- ✅ Local line editing
 
 
- 右键终端 → Settings → Terminal → 勾选: 
-  串口参数 - 波特率:115200
- 数据位:8,停止位:1,无流控
- 设备路径:COM7 (USB-SERIAL CH340)(需根据系统识别调整)
 
四、操作流程
-  启动服务器 iperf -s -p 5001 & # 后台启动- 预期输出:[1] 12345(进程ID)和单次本地端口号是5001。
 
- 预期输出:
-  客户端测试 
 在其他设备执行:iperf -c 192.168.16.112 -p 5001 # 替换为MCU的IP- 成功标志:服务端打印客户端连接信息及带宽。
 
-  终止服务器 iperf --stop # 或 kill -9 [进程ID]- 验证:ps | grep iperf无结果,netstat显示端口释放。
 
- 验证:
五、注意事项
-  硬件连接 - 确保USB转串口线(CH340)稳定连接,避免频繁插拔导致COM口失效。
 
-  线程优先级 - 调整RTOS线程优先级,避免iperf占用过高优先级阻塞终端任务: sys_thread_new("iperf", iperf_server, NULL, 2048, 3); // 优先级设为3(低于默认)
 
- 调整RTOS线程优先级,避免iperf占用过高优先级阻塞终端任务: 
-  内存泄漏 - 使用pvPortMalloc和vPortFree确保内存释放,添加分配失败检查:if (!send_buf) {printf("内存不足!\n");return; }
 
- 使用
六、故障排查表
| 现象 | 检查点 | 解决措施 | 
|---|---|---|
| 终端输入无响应 | 是否后台运行? jobs命令查看 | 使用 fg切前台后Ctrl+C终止 | 
| 端口绑定失败 | 端口是否被占用? netstat检查 | 更换端口或重启设备 | 
| 客户端无法连接 | 防火墙/路由设置,IP是否正确 | 关闭防火墙,检查子网掩码 | 
通过以上整理,可系统化解决iperf在MobaXterm串口终端中的使用问题,确保服务器可控运行及终端输入正常。