Files
STM32F4-Base/docs/CH395F_Test_Guide.md

226 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:60000PC 发到 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:8080PC 连到 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 4TCP Client 连 8080
**通过标准**:同 Phase 410/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 未完全关闭 | 已修复:先 closeRST不等 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]` |