# CH395F 测试使用指南 ## 目录 1. [快速开始](#1-快速开始) 2. [各阶段测试](#2-各阶段测试) - [Phase 1: 寄存器测试](#phase-1-寄存器测试) - [Phase 2: TCP Client 收发+重连](#phase-2-tcp-client) - [Phase 3: UDP Server Echo](#phase-3-udp-server-echo) - [Phase 4: NET 层 TCP Echo](#phase-4-net-层-tcp-echo) - [Phase 5: NET 层 UDP Echo](#phase-5-net-层-udp-echo) - [Phase 6: DHCP](#phase-6-dhcp) - [Phase 7: Select/Poll](#phase-7-selectpoll) - [Phase 8: 多客户端并发](#phase-8-多客户端并发) 3. [Python 脚本参考](#3-python-脚本参考) 4. [常见问题](#4-常见问题) --- ## 1. 快速开始 ### 启用/禁用测试 编辑 `Drivers/BSP/CH395F/ch395f_test.h`,取消注释想要测试的阶段: ```c //#define ENABLE_PHASE1_TESTS ← 取消注释即启用 #define ENABLE_PHASE2_TESTS ← 已启用 //#define ENABLE_PHASE3_TESTS ← 注释掉跳过 ``` ### 测试拓扑 ``` PC (192.168.1.2) ──── 交换机 ──── CH395F (192.168.1.100) ``` --- ## 2. 各阶段测试 ### Phase 1: 寄存器测试 | 项目 | 说明 | |------|------| | 类型 | 独立运行,无需 PC 配合 | | 耗时 | ~1 秒 | | 测试项 | 芯片版本、命令状态、IP/网关/掩码、全局中断一致性、Socket 中断、ARP、TTL | **操作**: ``` 1. 只启用 ENABLE_PHASE1_TESTS 2. 编译烧录 3. 看串口输出 ``` **通过标准**:串口打印 `=== Phase 1 Tests Complete ===`,中间无 ERROR。 --- ### Phase 2: TCP Client | 项目 | 说明 | |------|------| | 类型 | 需 PC 配合 | | 耗时 | ~60 秒 | | 测试项 | TCP Client 连接、收发 64 字节、PING echo、大包 echo、关闭重连 ×3 轮 | | 默认端口 | CH395F → PC:8081 | **操作**: ``` 终端 1: python test/ch395f_socket_test.py tcp_server --port 8081 --timeout 180 终端 2: 编译烧录(只启用 ENABLE_PHASE2_TESTS) ``` **通过标准**:串口显示 3 轮 `closed: sock=0x00`,PC 显示 3 次连接且 PING echo 匹配。 --- ### Phase 3: UDP Server Echo | 项目 | 说明 | |------|------| | 类型 | 需 PC 配合 | | 耗时 | ~30 秒 | | 测试项 | UDP Server 模式、8 字节头解析、PING echo ×5、大包 echo ×10 | | 默认端口 | CH395F:60000,PC 发到 60000 | **操作**: ``` 终端 1: 编译烧录(只启用 ENABLE_PHASE3_TESTS),看到 "UDP socket 7 opened" 终端 2: python test/ch395f_socket_test.py udp_client --ip 192.168.1.100 --port 60000 --timeout 30 ``` **通过标准**:PC 显示 PING 5/5 + 大包 10/10。 > **关键发现**:CH395F UDP 分两种模式——DesIP=`255.255.255.255` 是 Server 模式(接受任意来源),否则只能收指定 IP:Port。每次 `write_send_buf` 后必须等 `SINT_STAT_SENDBUF_FREE`。 --- ### Phase 4: NET 层 TCP Echo | 项目 | 说明 | |------|------| | 类型 | 需 PC 配合,主循环运行 | | 耗时 | 按需 | | 测试项 | `net_recv()` + `net_send()` 非阻塞 echo | | 默认端口 | CH395F TCP Server:8080,PC 连到 8080 | **操作**: ``` 终端 1: 编译烧录(只启用 ENABLE_PHASE4_TESTS),等主循环启动 终端 2: python test/ch395f_socket_test.py tcp_client --ip 192.168.1.100 --port 8080 ``` **通过标准**:10/10 回显匹配 + 大数据传输完整。 --- ### Phase 5: NET 层 UDP Echo | 项目 | 说明 | |------|------| | 类型 | 需 PC 配合,主循环运行 | | 耗时 | 按需 | | 测试项 | `net_recvfrom()` + `net_sendto()` 非阻塞 echo | | 默认端口 | CH395F UDP:60000 | **操作**: ``` 终端 1: 编译烧录(只启用 ENABLE_PHASE5_TESTS),等主循环启动 终端 2: python test/ch395f_socket_test.py udp_client --ip 192.168.1.100 --port 60000 --timeout 30 ``` **通过标准**:PING 5/5 + 大包 10/10。 --- ### Phase 6: DHCP | 项目 | 说明 | |------|------| | 类型 | 需 DHCP Server | | 耗时 | ~10 秒 | | 测试项 | 启用 DHCP、轮询状态、打印分配的 IP | > ⚠️ **DHCP 会改变 CH395F IP!** 必须独立运行,不能与其他 Phase 同时启用。 **操作**: ``` 终端 1: python test/dhcp_server.py ← 启动 DHCP Server(需管理员权限) 终端 2: 编译烧录(只启用 ENABLE_PHASE6_TESTS) ``` **通过标准**:PC 显示 `DHCP 分配完成!`,串口显示 IP/网关/掩码。 --- ### Phase 7: Select/Poll | 项目 | 说明 | |------|------| | 类型 | 需 PC 配合,主循环运行 | | 耗时 | 按需 | | 测试项 | `net_select()` 多路复用检测可读 socket → echo | | 默认端口 | CH395F TCP Server:8080 | **操作**:同 Phase 4(TCP Client 连 8080)。 **通过标准**:同 Phase 4(10/10 回显匹配)。 > Phase 4 和 Phase 7 功能相同但实现不同,通常只启用一个。Phase 7 额外验证了 `NET_FD_SET/ISSET` 宏和 `net_select()`。 --- ### Phase 8: 多客户端并发 | 项目 | 说明 | |------|------| | 类型 | 需 PC 配合,主循环运行 | | 耗时 | ~2 秒 | | 测试项 | 7 个 TCP 客户端并发,每客户端 10 轮 PING echo | | 默认端口 | CH395F TCP Server:8080 | **操作**: ``` 终端 1: 编译烧录(启用 ENABLE_PHASE4_TESTS 或 ENABLE_PHASE7_TESTS) 终端 2: python test/ch395f_socket_test.py stress --ip 192.168.1.100 --port 8080 --count 10 --timeout 30 ``` **通过标准**:7 并发 × 10 轮 = 70/70 成功率 100%。 --- ## 3. Python 脚本参考 | 命令 | 说明 | |------|------| | `tcp_server --port 8081` | PC 作 TCP Server,测试 CH395F TCP Client | | `tcp_client --ip x.x.x.x --port 8080` | PC 作 TCP Client,测试 CH395F TCP Server echo | | `udp_client --ip x.x.x.x --port 60000 --timeout 30` | PC 发 UDP PING,测试 CH395F UDP echo | | `udp_server --port 8082 --timeout 60` | PC 作 UDP Server,接收 CH395F 数据 | | `stress --ip x.x.x.x --port 8080 --count 10` | 7 并发压力测试 | | `dhcp_server.py` | 轻量 DHCP Server(管理员权限) | 通用参数: - `--ip`:目标 IP(默认 192.168.1.100) - `--port`:端口(各模式默认不同) - `--count`:测试次数(默认 10) - `--timeout`:超时秒数(默认 30) - `--size`:数据包大小(默认 1024) --- ## 4. 常见问题 | 问题 | 原因 | 解决 | |------|------|------| | Phase 2 `open_socket: 0x20 (FAIL)` | socket 未完全关闭 | 已修复:先 close(RST)不等 disconnect | | Phase 2 收到 `\x00(\x00\x00...` 乱码 | socket 4-7 默认无发送缓冲 | `set_send_buf(sock, 28, 2)` 分配 | | Phase 3 UDP 收不到数据 | DesIP 设为具体 IP 而非 255.255.255.255 | 设 DesIP=`0xFFFFFFFF` 进入 Server 模式 | | Phase 3 HELLO 收到但 PING 收不到 | 没等 `SENDBUF_FREE` 就第二次写 | 每次 `write_send_buf` 后轮询 `SINT_STAT_SENDBUF_FREE` | | Python 报 `WinError 10054` | STM32 还没启动 | 等串口看到阶段启动信息再跑 Python | | Phase 5 UDP 不工作 | NET 层 `net_bind()` 没打开 CH395F Socket | 已修复:`net_bind()` 对 DGRAM 类型自动打开 | | `net_recvfrom()` 源地址错误 | UDP 头解析偏移错了 | 已修复:端口读 `header[2-3]`,IP 读 `header[4-7]` |