通过测试排除了一些问题
This commit is contained in:
29
AGENTS.md
29
AGENTS.md
@@ -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` 不再发送 RST,Socket 卡在 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=0xFFFFFFFF(255.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 驱动关键点
|
||||
|
||||
|
||||
Reference in New Issue
Block a user