This commit is contained in:
2026-03-15 16:47:32 +08:00
parent e834928457
commit e885c1b7ea
7 changed files with 315 additions and 703 deletions
+17 -17
View File
@@ -10,16 +10,16 @@
| 红外传感器 | 256×192 DVP 接口热成像模组 |
| 网络 | RJ45 网线,连接到与上位机同一局域网的交换机/路由器 |
| NG 输出 | PA8 引脚可接 LED 或示波器观察脉冲 |
| 串口 | USART1 (115200 baud),连接 USB-TTL 调试串口 |
| 串口 | USART3 (921600 baud,PB10 TX / PB11 RX),连接 USB-TTL 调试串口 |
### 1.2 网络参数(代码默认值)
| 参数 | 值 | 对应文件 |
|------|-----|----------|
| MCU IP | `192.168.1.10` | `main.c` → `IPAddr` |
| 网关 | `192.168.1.1` | `main.c` → `GWIPAddr` |
| MCU IP | `192.168.7.10` | `main.c` → `IPAddr` |
| 网关 | `192.168.7.1` | `main.c` → `GWIPAddr` |
| 子网掩码 | `255.255.255.0` | `main.c` → `IPMask` |
| 上位机 IP | `192.168.1.50` | `main.c` → `DESIP`,`qdx_tcp_logic.c` → `SERVER_IP` |
| 上位机 IP | `192.168.7.50` | `main.c` → `DESIP`,`qdx_tcp_logic.c` → `SERVER_IP` |
| 控制流端口 | `5511` | `qdx_tcp_logic.c` → `CONTROL_PORT` |
| 数据流端口 | `5512` | `qdx_tcp_logic.c` → `DATA_PORT` |
@@ -27,7 +27,7 @@
### 1.3 上位机软件
将上位机 IP 设为 `192.168.1.50`,确保防火墙放行端口 5511 和 5512。
将上位机 IP 设为 `192.168.7.50`,确保防火墙放行端口 5511 和 5512。
**方式 A — PC Demo 程序**(推荐先用此方式验证基本通信):
@@ -72,7 +72,7 @@ api_demo.exe # 运行后作为 TCP 服务端监听 5511/5512
**目的**:确认 MCU 正常启动、FreeRTOS 调度器运行、心跳任务工作。
**操作**:
1. 连接串口终端(115200, 8N1)
1. 连接串口终端(921600, 8N1)
2. 上电或复位
**预期串口输出**:
@@ -103,9 +103,9 @@ WCHNET_LibInit Success
| 现象 | 可能原因 | 解决方案 |
|------|----------|----------|
| 无任何输出 | 串口未连接/波特率错误 | 检查 USART1 TX 引脚连线,确认 115200 |
| 无任何输出 | 串口未连接/波特率错误 | 检查 USART3 TX 引脚 (PB10) 连线,确认 921600 |
| 反复重启打印 `Flash/SRAM config changed` | Option Bytes 写入但未生效 | 先用 WCH-ISP 工具手动设置 Option Bytes |
| `err at line XXX of file "../FreeRTOS/tasks.c"` | Heap 不足 | 检查 `configTOTAL_HEAP_SIZE`(当前 12KB) |
| `err at line XXX of file "../FreeRTOS/tasks.c"` | Heap 不足 | 检查 `configTOTAL_HEAP_SIZE`(当前 16 KB) |
| 卡死无心跳 | HardFault / startup 配置错 | 检查 mstatus=0x7800、CSR 0x804=0x1f |
---
@@ -128,14 +128,14 @@ PHY Link Success
| # | 检查点 | 通过条件 |
|---|--------|----------|
| 1 | PHY 链路 | 插入网线后出现 `PHY Link Success` |
| 2 | 上位机 ping | 上位机执行 `ping 192.168.1.10` 能通 |
| 2 | 上位机 ping | 上位机执行 `ping 192.168.7.10` 能通 |
**故障排查**:
| 现象 | 可能原因 | 解决方案 |
|------|----------|----------|
| 无 PHY Link Success | 网线/PHY 硬件问题 | 检查 RJ45 座子焊接、网线 |
| ping 不通 | IP 冲突或子网不同 | 确认上位机 IP 在 192.168.1.x 段 |
| ping 不通 | IP 冲突或子网不同 | 确认上位机 IP 在 192.168.7.x 段 |
---
@@ -258,7 +258,7 @@ TCP Connected, socket 1
| 长时间运行 | 持续运行 24 小时 | 心跳持续、无 assert、无内存泄漏 |
| 反复断线重连 | 每 30 秒拔插网线 | 每次重连后双通道恢复 |
| 高频图像发送 | 传感器满帧率连续采集 | 无丢帧、无栈溢出 |
| 上位机先断后连 | MCU 先开机,30s 后再启动上位机 | MCU 自动重连成功 |
| 上位机先断后连 | MCU 先开机,30 s 后再启动上位机 | MCU 自动重连成功 |
---
@@ -266,7 +266,7 @@ TCP Connected, socket 1
| 参数 | 当前值 | 文件 |
|------|--------|------|
| `configTOTAL_HEAP_SIZE` | 12 KB | `FreeRTOSConfig.h` |
| `configTOTAL_HEAP_SIZE` | 16 KB | `FreeRTOSConfig.h` |
| `configTICK_RATE_HZ` | 500 | `FreeRTOSConfig.h` |
| `configMINIMAL_STACK_SIZE` | 256 words | `FreeRTOSConfig.h` |
| task_wchnet 栈 | 512 words (2 KB) | `main.c` |
@@ -283,18 +283,18 @@ TCP Connected, socket 1
## 6. 常见问题 FAQ
**Q: 心跳正常但 TCP 连不上?**
> 检查:① 上位机 IP 是否为 `192.168.1.50`;② 防火墙是否放行 5511/5512;③ `qdx_tcp_logic.c` 中 `SERVER_IP` 是否与 `main.c` 中 `DESIP` 一致。
> 检查:① 上位机 IP 是否为 `192.168.7.50`;② 防火墙是否放行 5511/5512;③ `qdx_tcp_logic.c` 中 `SERVER_IP` 是否与 `main.c` 中 `DESIP` 一致。
**Q: 编译报 RAM overflow?**
> 检查 `.bss` 总量。FrameBuffer (96KB) + ETH buffers (~32KB) + ucHeap (12KB) + 应用缓冲区 (~47KB) ≈ 187KB。如果增大了某个缓冲区导致超 192KB,需要相应缩减其他部分。
> 检查 `.bss` 总量。FrameBuffer (96KB) + ETH buffers (~32KB) + ucHeap (16KB) + 应用缓冲区 (~47KB) ≈ 191KB。如果增大了某个缓冲区导致超 192KB,需要相应缩减其他部分。
**Q: 运行时 assert (`err at line XXX`)?**
> 通常是 Heap 不足导致 `pvPortMalloc` 失败。确认 `configTOTAL_HEAP_SIZE` 为 12KB,任务栈未超预算。
> 通常是 Heap 不足导致 `pvPortMalloc` 失败。确认 `configTOTAL_HEAP_SIZE` 为 16KB,任务栈未超预算。
**Q: 如何启用栈溢出检测进行调试?**
> 在 `FreeRTOSConfig.h` 中设置 `configCHECK_FOR_STACK_OVERFLOW` 为 `2`,并实现 `vApplicationStackOverflowHook()` 函数打印任务名。**仅用于调试,发布时关闭**。
**Q: 如何调整上位机 IP?**
> 同时修改两处(保持一致):
> 1. `main.c` 第 107 行:`DESIP[4] = {x, x, x, x};`
> 2. `qdx_tcp_logic.c` 第 58 行:`SERVER_IP = "x.x.x.x";`
> 1. `main.c` 中 `DESIP[4] = {x, x, x, x};`
> 2. `qdx_tcp_logic.c` 中 `SERVER_IP = "x.x.x.x";`
+7 -7
View File
@@ -1,6 +1,6 @@
# 下位机协议实现完备性分析
> **分析日期**: 2026-03-14
> **分析日期**: 2026-03-15
> **对照文档**: 采集端通信协议规范 v2.1.3 (2026-02-07)
> **分析对象**: prj/TCPClient 工程全部源码
@@ -56,12 +56,12 @@
| 6 | CRC16 校验 | ✅ 已实现 | 收发双向 CRC16-MODBUS 校验 |
| 7 | 自动重连 | ✅ 已实现 | 检测断线后 3s 重连双通道 |
| 8 | 阈值蒙版输出 | ⚠️ 部分 | 滑窗搜索时低温 → 90 替换,但规范要求**输出数据**中低于 MaskThreshold → 替换为 0 |
| 9 | 触发延迟 (DelayMs) | ❌ 未实现 | 字段已解析但触发后无延迟等待逻辑 |
| 10 | 外部 GPIO 触发 | ❌ 未实现 | 无 EXTI 中断配置、消抖(DebounceIntervalMs)、触发逻辑 |
| 9 | 触发延迟 (DelayMs) | ✅ 已实现 | `burst_delay_pending` + `burst_delay_until_ms` 状态机实现,消抖后延迟再连拍 |
| 10 | 外部 GPIO 触发 | ✅ 已实现 | PA15/EXTI15 上升沿 EXTI 中断,`EXTI15_10_IRQHandler` + `burst_debounce_pending` 消抖 + `TriggerDelayMs` 延迟 |
| 11 | Alarm GPIO | ❌ 未实现 | AlarmGpioLine/AlarmHoldMs 字段已解析但无 GPIO 驱动 |
| 12 | 1D 数据采集处理 | ❌ 未实现 | Config1D 可接收但无 1D 环形缓冲区/切片/触发逻辑 |
| 12 | 1D 数据采集处理 | ✅ 已实现 | `S1D_IDLE / S1D_DEBOUNCE / S1D_COLLECTING` 完整状态机,内/外部触发、预环形缓冲、切片、发送 |
| 13 | Training 模式 | ❌ 未实现 | 字段可解析但无训练采样功能 |
| 14 | 消抖 (DebounceIntervalMs) | ❌ 未实现 | 依赖外部触发,一并缺失 |
| 14 | 消抖 (DebounceIntervalMs) | ✅ 已实现 | 2D 外部触发消抖与 1D `HighTimerLimit` 均已实现 |
---
@@ -71,8 +71,8 @@
|------|:---------:|:-------:|:---------:|
| 接收(控制通道) | 7 | 1 | 3 |
| 发送(数据通道) | 4 | 0 | 5 |
| 处理逻辑 | 7 | 1 | 6 |
| **合计** | **18** | **2** | **14** |
| 处理逻辑 | 10 | 1 | 3 |
| **合计** | **21** | **2** | **11** |
---
+10 -10
View File
@@ -36,7 +36,7 @@
| FLASH | 128KB |
| SRAM | 192KB (Option Bytes [7:5]=110) |
| 传感器 | Mini212G2 (256×192, Y16 原始温度) |
| 网络 | 10M 以太网 (WCHNET) |
| 网络 | 1000M 以太网 RGMII (WCHNET) |
| 串口波特率 | 921600 |
### 软件组件
@@ -66,7 +66,7 @@
| **自主触发** | ✅ 立即工作(无需服务器) | ✅ 需服务器下发 Enabled=1 后激活 |
| **TEMP_REQ** | ✅ 可用(需对应模式 Enabled=1) | ✅ 可用 |
| **NG GPIO** | ✅ PA8 始终初始化 | ✅ PA8 始终初始化 |
| **外部触发 GPIO** | ✅ PA0/EXTI0 始终初始化 | ✅ PA0/EXTI0 始终初始化 |
| **外部触发 GPIO** | ✅ PA15/EXTI15 始终初始化 | ✅ PA15/EXTI15 始终初始化 |
---
@@ -78,7 +78,7 @@
| 宏名 | 当前值 | 说明 |
|------|--------|------|
| `TEST_PATTERN_MODE` | **1** | **唯一编译开关**:1=测试模式,0=正常模式 |
| `TEST_PATTERN_MODE` | **0** | **唯一编译开关**:1=测试模式,0=正常模式 |
### 3.2 业务常量
@@ -86,7 +86,7 @@
|------|-----|------|
| `DEFAULT_BURST_COUNT` | 3 | 服务器未配置时的默认连拍帧数 |
| `DEFAULT_BURST_INTERVAL_MS` | 200 | 服务器未配置时的默认连拍间隔 (ms) |
| `MAX_TCP_PAYLOAD_SIZE` | 10240 | TCP 发送缓冲区大小 (字节) |
| `MAX_TCP_PAYLOAD_SIZE` | 9216 | TCP 发送缓冲区大小 (字节) |
| `KEEPALIVE_ENABLE` | 1 | TCP KeepAlive(20s 空闲 / 15s 探测 / 9 次) |
| `TEST_FPS_DELAY_MS` | 100 | 测试模式帧生成间隔 (~10 FPS) |
| `SNAPSHOT_1D_POINTS` | 30 | TEMP_REQ 1D 空间采样点数 |
@@ -545,15 +545,15 @@ task_business_entry (优先级 5)
### 11.3 缓冲区容量约束
```
MAX_TCP_PAYLOAD_SIZE = 10240 字节
MAX_TCP_PAYLOAD_SIZE = 9216 字节
HeadOffset = 64 字节(协议头预留)
可用像素空间 = 10240 - 64 = 10176 字节
最大像素数 = 10176 / 2 = 5088 像素
可用像素空间 = 9216 - 64 = 9152 字节
最大像素数 = 9152 / 2 = 4576 像素
推荐安全目标尺寸:
64 × 64 = 4096 像素 = 8192 字节 ✓
71 × 71 = 5041 像素 = 10082 字节 ✓
72 × 72 = 5184 像素 = 10368 字节 ✗ (触发降尺寸)
67 × 67 = 4489 像素 = 8978 字节 ✓
68 × 68 = 4624 像素 = 9248 字节 ✗ (触发降尺寸)
```
### 11.4 自动降尺寸保护
@@ -561,7 +561,7 @@ HeadOffset = 64 字节(协议头预留)
TargetWidth × TargetHeight × 2 超过可用缓冲区时,自动等比减半:
```
示例:服务器设 185×70 → 185×70×2=25900 > 10176 → 减半 → 93×35
示例:服务器设 185×70 → 185×70×2=25900 > 9152 → 减半 → 93×35
日志:PP: target clamped 185x70 -> 93x35 (buf=10176)
```