通过测试排除了一些问题

This commit is contained in:
2026-07-19 04:32:18 +08:00
parent 1669cd216d
commit 4eb728583b
12 changed files with 1379 additions and 183 deletions

View File

@@ -133,6 +133,35 @@ HAL_Init() → SystemClock_Config() → MX_GPIO_Init() → MX_USART1_UART_Init()
- **TCP 重传参数**`SET_RETRAN_COUNT`默认12次最大20`SET_RETRAN_PERIOD`默认500ms最大1000ms必须在 `INIT_CH395` 之前设置,总重传时间 = 次数 × 周期
- **KeepAlive 参数必须为 500ms 的倍数**`SET_KEEPALIVE_IDLE`默认20000ms`SET_KEEPALIVE_INTVL`默认15000ms单位为 ms且 IDLE 必须 > INTVL均为 500 的倍数;传入非 500 倍数的值会导致未定义行为CH395F 内部定时器异常TCP 连接几秒内 TIMEOUT
- **KeepAlive 默认关闭**:需在 `SINT_STAT_CONNECT` 后调用 `ch395f_set_keepalive_enable(sock, 1)` 启用
- **Socket 4-7 默认无收发缓冲**CH395F 默认只为 Socket 0-3 各分配 4 个缓冲区块2048 字节)。多连接模式下使用 Socket 4-7 时,**必须在 `open_socket` 之前**显式分配:
- `ch395f_set_send_buf(sock, 28, 2)` — 分配发送缓冲(例:块 28-29共 1024 字节)
- `ch395f_set_recv_buf(sock, 30, 2)` — 分配接收缓冲(例:块 30-31共 1024 字节)
- 不分配会导致发送数据为固定垃圾内容(`0x0028` 填充)、接收缓冲区无法存储数据
- **TCP 关闭重连的正确方法****直接调用 `ch395f_close_socket()`,不要先调 `ch395f_tcp_disconnect()`**
-`disconnect``close``disconnect` 发送 FIN 将 Socket 推入 FIN_WAIT_2此后 `close` 不再发送 RSTSocket 卡在 FIN_WAIT_2 必须等远端发 FIN 才能关闭(可能需数分钟超时)
-`close` 直接:在 ESTABLISHED 或 CLOSE_WAIT 状态下调用 `close` 会发送 RST 立即终止连接Socket 瞬间回到 CLOSED已验证 `closed: sock=0x00 tcp=0x00`
- 关闭后需轮询 `ch395f_get_socket_status()` 等待 `sock=0x00``open_socket`,典型耗时 < 1s
- **SOCK_TIMEOUT 中断**:长时间无数据时 CH395F 可能触发 `SINT_STAT_SOCK_TIMEOUT`,不应将其视为致命错误——记录日志后继续操作即可,不要因此关闭 Socket
- **UDP 客户端/服务器模式**(手册 §9.2.4):通过 `SET_DES_IP_SN` 的 IP 地址区分:
- **DesIP=0xFFFFFFFF255.255.255.255)→ UDP Server 模式**:接受任意来源的数据,接收缓冲区中数据前 8 字节为信息头(`[0-1]reserved [2-3]src_port(LE) [4-7]src_ip [8+]payload`),回发前需设置 `SET_DES_IP``SET_DES_PORT` 指定目标
- **DesIP=具体 IP → UDP Client 模式**:只接受指定 IP:Port 的数据,接收数据无信息头,只能向预设的目标发送
- **UDP 发送缓冲必须等 SENDBUF_FREE**(手册要求):每次 `ch395f_write_send_buf()` 后必须等待 `SINT_STAT_SENBUF_FREE` 中断0x01否则下次写入会被 CH395F 静默丢弃。可通过轮询 `ch395f_get_sock_int_status()` 检查此标志
## 测试说明
- **测试代码文件**`Drivers/BSP/CH395F/ch395f_test.h` / `ch395f_test.c`
- **PC 端测试脚本**`test/ch395f_socket_test.py`,支持 Python 3.7+
- **调用入口**`Src/main.c``USER CODE BEGIN 2` 区域
- **Phase 1**9 项寄存器测试):✅ 通过
- **Phase 2**TCP Client 收发 + 关闭重连 ×3 轮):✅ 通过
- **Phase 3**UDP Server Echo + PING + 大包):✅ 通过
- **Phase 4**NET 层 TCP Echo✅ 通过,主循环永久运行
- **Phase 5**NET 层 UDP Echo✅ 通过
- **Phase 6**DHCP 自动获取 IP✅ 通过
- **Phase 7**Select/Poll I/O 多路复用):✅ 通过
- **Phase 8**(多客户端 7 并发):✅ 通过,成功率 100%
- **测试拓扑**PC (192.168.1.2) ↔ 交换机 ↔ CH395F (192.168.1.100)
- **详细使用说明**:见 `docs/CH395F_Test_Guide.md`
## GD5F2GQ5UE 驱动关键点