a
This commit is contained in:
@@ -0,0 +1,425 @@
|
||||
# 固件升级问题
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt)
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp)
|
||||
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp)
|
||||
- [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat)
|
||||
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp)
|
||||
- [http_client.h](file://h/httpClient/http_client.h)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件系统性梳理固件升级过程中可能出现的问题与解决策略,重点围绕以下方面:
|
||||
- 网络连接失败、服务器不可达、文件下载中断、校验错误等常见问题
|
||||
- 解析日志“Could not resolve host: update.geomative.com”的根本原因与定位方法
|
||||
- LicenseUpgrade.cpp 中升级流程的实现机制,包括 HTTP 请求处理与文件传输逻辑
|
||||
- 提供解决方案:检查网络、配置代理、手动下载固件包等
|
||||
- 指导用户使用 IAP-GD10.bat 等批处理脚本进行离线升级,并验证升级结果
|
||||
- 为技术支持人员提供恢复模式的操作指南
|
||||
|
||||
## 项目结构
|
||||
本仓库包含升级相关的 UI 交互、网络传输、文件下载、DFU 烧写与批处理脚本等模块。关键路径如下:
|
||||
- 升级 UI 与流程控制:cpp/Operator/LicenseUpgrade.cpp
|
||||
- 文件下载与传输:cpp/Tools/FileTransfer_crul.cpp、cpp/Tools/FileTransfer.cpp、cpp/Tools/HttpDownload.cpp
|
||||
- 网络连接与重连:cpp/Tools/NetWorkOper.cpp
|
||||
- 日志与诊断:LOG/upg_geo_filetrans_log.txt
|
||||
- 离线升级脚本:Install/Geomative Studio/tools/IAP-GD10.bat、Install/Geomative Studio/tools/License-GD10.bat、tools/License-GD20.bat
|
||||
- 在线固件升级流程:cpp/Tools/checkupdate.cpp
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "升级UI层"
|
||||
LU["LicenseUpgrade.cpp"]
|
||||
end
|
||||
subgraph "传输与下载层"
|
||||
FTC["FileTransfer_crul.cpp"]
|
||||
FT["FileTransfer.cpp"]
|
||||
HD["HttpDownload.cpp"]
|
||||
end
|
||||
subgraph "网络与重连"
|
||||
NWO["NetWorkOper.cpp"]
|
||||
end
|
||||
subgraph "日志与诊断"
|
||||
LOG["upg_geo_filetrans_log.txt"]
|
||||
end
|
||||
subgraph "离线脚本"
|
||||
IAP["IAP-GD10.bat"]
|
||||
LGD10["License-GD10.bat"]
|
||||
LGD20["License-GD20.bat"]
|
||||
end
|
||||
subgraph "在线升级"
|
||||
CU["checkupdate.cpp"]
|
||||
end
|
||||
LU --> FTC
|
||||
LU --> FT
|
||||
FTC --> LOG
|
||||
IAP --> LGD10
|
||||
LGD10 --> LGD20
|
||||
CU --> LGD20
|
||||
NWO --> LU
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp#L1-L47)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L60-L120)
|
||||
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L62-L125)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
- [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1042-L1336)
|
||||
|
||||
章节来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp#L1-L47)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L60-L120)
|
||||
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L62-L125)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
- [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1042-L1336)
|
||||
|
||||
## 核心组件
|
||||
- LicenseUpgrade:负责选择设备、下载 License 文件、触发 DFU 烧写脚本、显示进度与结果。
|
||||
- FileTransfer_crul:基于 libcurl 的 HTTP 下载封装,支持超时、进度回调、错误日志与 IPv4 DNS 解析。
|
||||
- FileTransfer:通用文件传输工具接口与辅助函数。
|
||||
- HttpDownload:基于 Winsock 的多线程断点续传下载器(备用/对比实现)。
|
||||
- NetWorkOper:网络连接管理、重连、控制命令收发与设备上下线通知。
|
||||
- 日志:upg_geo_filetrans_log.txt 记录 DNS 解析失败等错误。
|
||||
- 批处理脚本:IAP-GD10.bat、License-GD10.bat、License-GD20.bat 实现离线 DFU 烧写。
|
||||
- checkupdate:在线固件升级流程(文件准备、复制、发送、校验)。
|
||||
|
||||
章节来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp#L1-L47)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L60-L120)
|
||||
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L62-L125)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
- [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1042-L1336)
|
||||
|
||||
## 架构总览
|
||||
升级流程分为在线与离线两条主线:
|
||||
- 在线升级:LicenseUpgrade 触发 FileTransfer_crul 下载 FACTORY/LICENSE,随后通过批处理脚本执行 DFU 烧写。
|
||||
- 离线升级:IAP-GD10.bat 先生成 DFU 文件,再通过 DfuSeCommand 烧写;License-GD10/20.bat 分别烧写 FACTORY 与 LICENSE。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "LicenseUpgrade.cpp"
|
||||
participant FT as "FileTransfer_crul.cpp"
|
||||
participant LOG as "upg_geo_filetrans_log.txt"
|
||||
participant BAT as "License-GD10.bat/License-GD20.bat"
|
||||
participant DFU as "DfuSeCommand"
|
||||
participant DEV as "目标设备"
|
||||
UI->>FT : 设置URL/路径/超时/进度
|
||||
FT->>FT : GetUrlResConValild() 测试URL可达性(IPv4)
|
||||
FT-->>UI : 返回下载结果
|
||||
alt 成功
|
||||
UI->>BAT : 启动烧写脚本
|
||||
BAT->>DFU : 生成并烧写 FACTORY/LIC
|
||||
DFU-->>DEV : 写入固件
|
||||
UI-->>UI : 显示升级成功
|
||||
else 失败
|
||||
FT-->>LOG : 记录错误日志
|
||||
UI-->>UI : 弹窗提示网络/权限/超时
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L355-L428)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 组件A:LicenseUpgrade(在线升级流程)
|
||||
- 功能要点
|
||||
- 设备选择与在线状态检查
|
||||
- 下载 FACTORY 与 LICENSE 文件(通过 FileTransfer_crul)
|
||||
- 触发 DFU 烧写脚本(License-GD10/20.bat)
|
||||
- 进度条与百分比显示
|
||||
- 关键流程
|
||||
- 初始化 FileTransfer,设置下载路径、名称、超时与进度回调
|
||||
- 拼接下载 URL(theApp.m_strUpgUrl + 设备序列号 + 文件名)
|
||||
- 循环下载 FACTORY/LICENSE,失败则清理并返回
|
||||
- 下载完成后执行 DFU 烧写脚本,等待进程结束并提示结果
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 GetLicenseFile"]) --> Init["初始化 FileTransfer<br/>设置超时/进度/路径"]
|
||||
Init --> Loop{"遍历 FACTORY/LICENSE"}
|
||||
Loop --> |设置URL/名称| SetOpt["SetOption(OPT_URL_ADDRESS/OPT_DOWNLOAD_NAME)"]
|
||||
SetOpt --> Download["DownloadFile()"]
|
||||
Download --> Ok{"下载成功?"}
|
||||
Ok --> |否| Cleanup["清理/删除 FACTORY 并返回失败"]
|
||||
Ok --> |是| Next["更新进度/显示100%"]
|
||||
Next --> Loop
|
||||
Loop --> |完成| Burn["CreateProcess 启动 License-GD10/20.bat"]
|
||||
Burn --> Wait["WaitForSingleObject 等待进程"]
|
||||
Wait --> Result{"结果判定"}
|
||||
Result --> |成功| Done(["升级成功"])
|
||||
Result --> |超时/失败| Fail(["升级失败"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
|
||||
章节来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
|
||||
### 组件B:FileTransfer_crul(HTTP 下载与错误日志)
|
||||
- 功能要点
|
||||
- 初始化 libcurl,版本检查
|
||||
- 设置 URL、超时、进度回调、错误缓冲
|
||||
- GetUrlResConValild 对 URL 进行 HEAD 测试,强制使用 IPv4 解析,最多重试 3 次
|
||||
- DownloadFile 执行实际下载,写入本地文件,记录详细日志
|
||||
- 错误日志
|
||||
- 当 curl_perform 失败时,记录错误信息与 URL
|
||||
- 当文件写入失败或字节数不匹配时,记录错误日志
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["SetOption 配置"] --> B["GetUrlResConValild(URL)"]
|
||||
B --> C{"curl_perform 成功?"}
|
||||
C --> |否| E["记录错误日志<br/>返回失败"]
|
||||
C --> |是| D["DownloadFile() 执行下载"]
|
||||
D --> F{"CURLE_OK?"}
|
||||
F --> |否| G["弹窗提示网络环境<br/>记录错误日志"]
|
||||
F --> |是| H["关闭句柄/返回成功"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L355-L428)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
|
||||
章节来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L355-L428)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
|
||||
### 组件C:离线升级脚本(IAP-GD10.bat 与 License-GD10/20.bat)
|
||||
- IAP-GD10.bat
|
||||
- 生成 APP.dfu 并通过 DfuSeCommand 烧写
|
||||
- 删除临时 dfu 文件
|
||||
- License-GD10/20.bat
|
||||
- 先烧写 FACTORY,再烧写 LICENSE
|
||||
- 使用 DfuCreateFile 与 DfuSeCommand
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant IAP as "IAP-GD10.bat"
|
||||
participant DFU as "DfuCreateFile/DfuSeCommand"
|
||||
participant L10 as "License-GD10.bat"
|
||||
participant L20 as "License-GD20.bat"
|
||||
U->>IAP : 双击运行
|
||||
IAP->>DFU : 生成APP.dfu并烧写
|
||||
U->>L10 : 双击运行
|
||||
L10->>DFU : 生成并烧写 FACTORY
|
||||
U->>L20 : 双击运行
|
||||
L20->>DFU : 生成并烧写 LICENSE
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
|
||||
章节来源
|
||||
- [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
|
||||
### 组件D:在线固件升级(checkupdate.cpp)
|
||||
- 功能要点
|
||||
- 准备固件文件,复制到 .\firmware\ 目录
|
||||
- 通过设备命令删除 SD 卡上的旧文件
|
||||
- 发送新文件到 /SD/ 并校验结果
|
||||
- 适用场景
|
||||
- 在线升级功能板固件,与 License 升级流程互补
|
||||
|
||||
章节来源
|
||||
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1042-L1336)
|
||||
|
||||
## 依赖关系分析
|
||||
- LicenseUpgrade 依赖 FileTransfer_crul 进行 HTTP 下载
|
||||
- FileTransfer_crul 依赖 libcurl,内部强制 IPv4 解析并带重试
|
||||
- NetWorkOper 提供网络连接与重连能力,保障在线通信
|
||||
- 批处理脚本依赖 dfu 工具链完成离线烧写
|
||||
- 日志文件 upg_geo_filetrans_log.txt 记录 DNS 解析失败等错误
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
LU["LicenseUpgrade.cpp"] --> FTC["FileTransfer_crul.cpp"]
|
||||
FTC --> CURL["libcurl"]
|
||||
NWO["NetWorkOper.cpp"] --> LU
|
||||
LGD10["License-GD10.bat"] --> DFU["DfuSeCommand"]
|
||||
LGD20["License-GD20.bat"] --> DFU
|
||||
LOG["upg_geo_filetrans_log.txt"] --> FTC
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L62-L125)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
|
||||
章节来源
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L173-L269)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L62-L125)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
|
||||
## 性能考量
|
||||
- IPv4 强制解析与重试:GetUrlResConValild 中使用 IPv4 解析与最多 3 次重试,有助于在网络不稳定时提升成功率。
|
||||
- 进度回调与超时:DownloadFile 支持进度回调与超时设置,避免长时间阻塞。
|
||||
- 断点续传(对比实现):HttpDownload 支持多线程断点续传,适合大文件下载场景。
|
||||
- 离线烧写:批处理脚本一次性生成并烧写,减少多次交互带来的延迟。
|
||||
|
||||
章节来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L355-L428)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L60-L120)
|
||||
|
||||
## 故障排查指南
|
||||
|
||||
### 1. 症状:DNS 解析失败(Could not resolve host)
|
||||
- 现象
|
||||
- 日志出现“Could not resolve host: update.geomative.com”
|
||||
- 根因
|
||||
- DNS 解析失败或网络配置异常
|
||||
- 可能受代理、防火墙或本地 DNS 服务器影响
|
||||
- 定位步骤
|
||||
- 使用 nslookup 或 ping 测试域名解析
|
||||
- 检查系统代理与企业防火墙策略
|
||||
- 在 FileTransfer_crul 中强制使用 IPv4 解析,减少 AAAA 记录干扰
|
||||
- 解决方案
|
||||
- 更换 DNS 服务器(如 8.8.8.8 或 114.114.114.114)
|
||||
- 配置系统代理或绕过代理访问
|
||||
- 使用离线脚本进行升级(IAP-GD10.bat、License-GD10/20.bat)
|
||||
|
||||
章节来源
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L355-L428)
|
||||
- [http_client.h](file://h/httpClient/http_client.h#L593-L973)
|
||||
|
||||
### 2. 症状:服务器不可达/超时
|
||||
- 现象
|
||||
- DownloadFile 返回失败,弹窗提示检查网络环境
|
||||
- 根因
|
||||
- 网络不稳定、服务器负载高、超时设置过短
|
||||
- 解决方案
|
||||
- 增大超时时间(SetOption(OPT_TIMEOUT))
|
||||
- 使用断点续传(HttpDownload)或重试机制
|
||||
- 离线升级(下载到本地后使用批处理脚本)
|
||||
|
||||
章节来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L151-L281)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L60-L120)
|
||||
|
||||
### 3. 症状:文件下载中断/写入失败
|
||||
- 现象
|
||||
- 写入文件失败或写入字节数不匹配
|
||||
- 根因
|
||||
- 权限不足、磁盘空间不足、文件被占用
|
||||
- 解决方案
|
||||
- 确认 .\tools\ 目录可写且有足够空间
|
||||
- 关闭占用文件的程序
|
||||
- 重新下载并检查校验
|
||||
|
||||
章节来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L284-L310)
|
||||
|
||||
### 4. 症状:校验错误/升级失败
|
||||
- 现象
|
||||
- DFU 烧写后设备未识别或功能异常
|
||||
- 根因
|
||||
- 文件损坏、版本不兼容、烧写顺序错误
|
||||
- 解决方案
|
||||
- 重新下载并校验文件
|
||||
- 按 FACTORY -> LICENSE 的顺序烧写
|
||||
- 使用 checkupdate.cpp 的在线升级流程进行功能板固件升级
|
||||
|
||||
章节来源
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1042-L1336)
|
||||
|
||||
### 5. 症状:网络连接不稳定
|
||||
- 现象
|
||||
- 连接中断、重连频繁
|
||||
- 根因
|
||||
- 网络波动、代理切换、设备上下线
|
||||
- 解决方案
|
||||
- 使用 NetWorkOper 的自动重连机制
|
||||
- 避免在 WiFi 模式下进行大量数据传输
|
||||
- 保持稳定的网络环境
|
||||
|
||||
章节来源
|
||||
- [NetWorkOper.cpp](file://cpp/Tools/NetWorkOper.cpp#L366-L480)
|
||||
|
||||
## 结论
|
||||
- 在线升级依赖稳定的网络与正确的 DNS 解析;FileTransfer_crul 提供了 IPv4 强制解析与重试机制,显著提升成功率。
|
||||
- 离线升级通过批处理脚本与 DFU 工具链实现,适用于网络受限或不可达场景。
|
||||
- 日志文件与错误提示是快速定位问题的关键,建议优先查看 upg_geo_filetrans_log.txt 与 FileTransfer_crul 的错误日志。
|
||||
- 技术支持可结合 NetWorkOper 的重连逻辑与 checkupdate.cpp 的在线升级流程,完成复杂场景下的恢复与验证。
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 使用 IAP-GD10.bat 进行离线升级
|
||||
- 步骤
|
||||
- 运行 IAP-GD10.bat 生成并烧写 APP.dfu
|
||||
- 运行 License-GD10.bat 烧写 FACTORY
|
||||
- 运行 License-GD20.bat 烧写 LICENSE
|
||||
- 验证
|
||||
- 观察脚本输出与设备指示灯状态
|
||||
- 重启设备并确认功能正常
|
||||
|
||||
章节来源
|
||||
- [IAP-GD10.bat](file://Install/Geomative Studio/tools/IAP-GD10.bat#L1-L16)
|
||||
- [License-GD10.bat](file://Install/Geomative Studio/tools/License-GD10.bat#L1-L20)
|
||||
- [License-GD20.bat](file://tools/License-GD20.bat#L1-L20)
|
||||
|
||||
### B. 在线升级流程(checkupdate.cpp)
|
||||
- 步骤
|
||||
- 准备固件文件并复制到 .\firmware\ 目录
|
||||
- 通过设备命令删除 SD 卡旧文件
|
||||
- 发送新文件并校验结果
|
||||
- 适用范围
|
||||
- 功能板固件升级,与 License 升级互补
|
||||
|
||||
章节来源
|
||||
- [checkupdate.cpp](file://cpp/Tools/checkupdate.cpp#L1042-L1336)
|
||||
@@ -0,0 +1,398 @@
|
||||
# 故障排除
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt)
|
||||
- [20211110.txt](file://Install/Geomative Studio/LOG/general/20211110.txt)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt)
|
||||
- [config.ini](file://Install/Geomative Studio/config.ini)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
|
||||
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp)
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [常见问题模式分析](#常见问题模式分析)
|
||||
3. [设备连接失败](#设备连接失败)
|
||||
4. [固件升级错误](#固件升级错误)
|
||||
5. [数据传输问题](#数据传输问题)
|
||||
6. [配置异常](#配置异常)
|
||||
7. [诊断工具使用方法](#诊断工具使用方法)
|
||||
8. [日志分析技巧](#日志分析技巧)
|
||||
9. [设备检测模块工作机制](#设备检测模块工作机制)
|
||||
10. [系统性问题排查流程](#系统性问题排查流程)
|
||||
11. [修复建议](#修复建议)
|
||||
|
||||
## 引言
|
||||
本文档旨在为技术支持人员和高级用户提供一个全面的故障排除指南。基于系统日志文件分析,文档化了设备连接失败、固件升级错误、数据传输问题和配置异常等常见问题模式。通过深入分析日志文件和相关代码组件,本文档提供了错误代码的含义、相应的解决方案、诊断工具的使用方法以及日志分析技巧。同时,解释了设备检测模块的工作机制和常见检测失败的原因,为用户提供系统性的问题排查流程和修复建议。
|
||||
|
||||
## 常见问题模式分析
|
||||
通过对系统日志文件的分析,我们识别出以下几种常见问题模式:
|
||||
|
||||
1. **设备连接失败**:在`detect_gd20_log.txt`日志文件中,多次出现"现在准备查找gd20设备!"的日志记录,但没有后续的连接成功或失败信息,表明设备检测过程可能被中断或未能完成。
|
||||
|
||||
2. **网络连接问题**:在`upg_geo_filetrans_log.txt`日志文件中,存在"无法解析主机update.geomative.com"的错误信息,这表明系统在尝试连接更新服务器时遇到了DNS解析问题。
|
||||
|
||||
3. **文件操作异常**:在`20211110.txt`日志文件中,记录了删除通用日志文件的操作,这可能是系统正常清理过程的一部分,但也可能指示文件访问权限问题。
|
||||
|
||||
4. **配置文件问题**:`config.ini`文件中的配置项显示了系统与远程服务器的连接信息,包括URL、IP地址和端口等,这些配置的正确性直接影响系统的网络功能。
|
||||
|
||||
**Section sources**
|
||||
- [detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt#L1-L4)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
- [20211110.txt](file://Install/Geomative Studio/LOG/general/20211110.txt#L1-L4)
|
||||
- [config.ini](file://Install/Geomative Studio/config.ini#L1-L73)
|
||||
|
||||
## 设备连接失败
|
||||
设备连接失败是用户最常见的问题之一。根据日志分析和代码审查,我们总结了以下可能的原因和解决方案:
|
||||
|
||||
### 可能原因
|
||||
1. **设备未正确连接**:物理连接松动或USB接口问题可能导致设备无法被识别。
|
||||
2. **驱动程序问题**:缺少或损坏的驱动程序可能导致设备无法正常工作。
|
||||
3. **设备名称不匹配**:代码中定义的设备名称与实际设备名称不一致。
|
||||
4. **权限问题**:应用程序可能没有足够的权限访问USB设备。
|
||||
|
||||
### 解决方案
|
||||
1. **检查物理连接**:确保设备与计算机的连接牢固,尝试更换USB线缆或使用不同的USB端口。
|
||||
2. **安装/更新驱动程序**:从`Install\GD_10`目录下的`.inf`文件安装正确的驱动程序。
|
||||
3. **验证设备名称**:检查`DetcGD10Dev.cpp`文件中的设备名称定义,确保与实际设备匹配。
|
||||
4. **以管理员身份运行**:尝试以管理员权限运行应用程序,确保有足够的系统权限。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始设备连接] --> B{设备已连接?}
|
||||
B --> |是| C[检查驱动程序]
|
||||
B --> |否| D[检查物理连接]
|
||||
C --> E{驱动程序正常?}
|
||||
E --> |是| F[检测设备名称]
|
||||
E --> |否| G[安装/更新驱动程序]
|
||||
F --> H{名称匹配?}
|
||||
H --> |是| I[建立连接]
|
||||
H --> |否| J[修改设备名称配置]
|
||||
I --> K[连接成功]
|
||||
D --> L[重新连接设备]
|
||||
G --> M[重启应用程序]
|
||||
J --> N[更新配置文件]
|
||||
K --> O[结束]
|
||||
M --> C
|
||||
N --> F
|
||||
L --> B
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
|
||||
|
||||
**Section sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
|
||||
- [detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt#L1-L4)
|
||||
|
||||
## 固件升级错误
|
||||
固件升级过程中可能出现多种错误,主要涉及网络连接、文件传输和权限问题。
|
||||
|
||||
### 错误代码与含义
|
||||
1. **curl_perform failed**:cURL库执行失败,通常与网络连接问题有关。
|
||||
2. **Bettery is low**:设备电量过低,无法进行固件升级。
|
||||
3. **Update license failed**:许可证更新失败,可能由于操作系统环境问题。
|
||||
|
||||
### 解决方案
|
||||
1. **检查网络连接**:确保计算机能够访问互联网,特别是能够解析`update.geomative.com`域名。
|
||||
2. **充电设备**:在进行固件升级前,确保设备电量充足。
|
||||
3. **检查防火墙设置**:确保防火墙没有阻止应用程序的网络访问。
|
||||
4. **以管理员身份运行**:某些系统操作需要管理员权限。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 用户 as 用户
|
||||
participant 应用程序 as 应用程序
|
||||
participant 服务器 as 更新服务器
|
||||
用户->>应用程序 : 请求固件升级
|
||||
应用程序->>应用程序 : 检查设备电量
|
||||
应用程序-->>用户 : 电量不足提示
|
||||
应用程序->>应用程序 : 建立网络连接
|
||||
应用程序->>服务器 : 请求更新文件
|
||||
alt 网络连接成功
|
||||
服务器-->>应用程序 : 发送更新文件
|
||||
应用程序->>应用程序 : 验证文件完整性
|
||||
应用程序->>应用程序 : 执行固件升级
|
||||
应用程序-->>用户 : 升级成功
|
||||
else 网络连接失败
|
||||
服务器-->>应用程序 : 连接失败
|
||||
应用程序-->>用户 : 网络错误提示
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L1-L497)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L1-L1200)
|
||||
|
||||
**Section sources**
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L1-L497)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L1-L1200)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
|
||||
## 数据传输问题
|
||||
数据传输问题通常与串口通信、协议实现和数据完整性有关。
|
||||
|
||||
### 常见问题
|
||||
1. **串口通信失败**:在`SComPort.cpp`中实现了串口通信,但可能由于波特率、数据位等参数不匹配导致通信失败。
|
||||
2. **数据校验错误**:ZMODEM协议用于文件传输,CRC校验失败可能导致数据传输中断。
|
||||
3. **超时问题**:数据接收超时可能导致传输失败。
|
||||
|
||||
### 解决方案
|
||||
1. **检查串口参数**:确保应用程序和设备的串口参数(波特率、数据位、停止位等)一致。
|
||||
2. **重试机制**:实现自动重试机制,在传输失败时自动重新发送数据。
|
||||
3. **优化超时设置**:根据网络状况调整超时时间,避免因短暂网络波动导致传输失败。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[开始数据传输] --> B[建立串口连接]
|
||||
B --> C{连接成功?}
|
||||
C --> |是| D[发送数据包]
|
||||
C --> |否| E[检查串口参数]
|
||||
D --> F[等待响应]
|
||||
F --> G{收到响应?}
|
||||
G --> |是| H[检查CRC校验]
|
||||
G --> |否| I[重试发送]
|
||||
H --> J{校验通过?}
|
||||
J --> |是| K[传输完成]
|
||||
J --> |否| L[请求重传]
|
||||
E --> M[修正参数]
|
||||
M --> B
|
||||
I --> D
|
||||
L --> D
|
||||
K --> N[结束]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L1-L1199)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L1287-L1320)
|
||||
|
||||
**Section sources**
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L1-L1199)
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp#L1-L47)
|
||||
|
||||
## 配置异常
|
||||
配置异常可能导致系统功能不正常或完全无法工作。
|
||||
|
||||
### 常见配置问题
|
||||
1. **更新服务器URL错误**:`config.ini`文件中的URL配置不正确。
|
||||
2. **远程连接参数错误**:IP地址和端口配置错误。
|
||||
3. **多通道设置问题**:多通道模式配置不当。
|
||||
|
||||
### 解决方案
|
||||
1. **验证配置文件**:检查`config.ini`文件中的各项配置是否正确。
|
||||
2. **使用默认配置**:当配置出现问题时,可以尝试使用默认配置。
|
||||
3. **配置备份**:定期备份配置文件,以便在出现问题时快速恢复。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class ConfigManager {
|
||||
+string UpdateUrl
|
||||
+string HomePage
|
||||
+int RemoteType
|
||||
+string IP
|
||||
+int Port
|
||||
+int VerID
|
||||
+int TimeZone
|
||||
+bool IsMultiChannel
|
||||
+string UserID
|
||||
+string UserPwd
|
||||
+bool UserSave
|
||||
+bool UserAuto
|
||||
+int PLC_Set_Interval
|
||||
+loadConfig() bool
|
||||
+saveConfig() bool
|
||||
+validateConfig() bool
|
||||
+resetToDefault() void
|
||||
}
|
||||
class ConfigValidator {
|
||||
+validateUrl(string) bool
|
||||
+validateIP(string) bool
|
||||
+validatePort(int) bool
|
||||
+validateCredentials(string, string) bool
|
||||
}
|
||||
ConfigManager --> ConfigValidator : "uses"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [config.ini](file://Install/Geomative Studio/config.ini#L1-L73)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661)
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://Install/Geomative Studio/config.ini#L1-L73)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661)
|
||||
|
||||
## 诊断工具使用方法
|
||||
本节介绍系统内置诊断工具的使用方法。
|
||||
|
||||
### 设备检测工具
|
||||
1. **启动设备检测**:应用程序启动时自动执行设备检测。
|
||||
2. **查看检测日志**:检查`detect_gd20_log.txt`文件获取检测过程的详细信息。
|
||||
3. **手动触发检测**:可以通过特定命令或界面操作手动触发设备检测。
|
||||
|
||||
### 网络诊断工具
|
||||
1. **连接测试**:使用内置的HTTP下载功能测试与服务器的连接。
|
||||
2. **DNS解析测试**:验证域名能否正确解析为IP地址。
|
||||
3. **端口连通性测试**:检查指定端口是否开放。
|
||||
|
||||
### 串口诊断工具
|
||||
1. **串口扫描**:列出系统中所有可用的串口设备。
|
||||
2. **通信测试**:发送测试数据包验证串口通信是否正常。
|
||||
3. **参数配置**:调整波特率、数据位等串口参数。
|
||||
|
||||
**Section sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L1-L1200)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L1-L1199)
|
||||
|
||||
## 日志分析技巧
|
||||
有效的日志分析是故障排除的关键。以下是一些实用的日志分析技巧:
|
||||
|
||||
### 日志文件位置
|
||||
1. **设备检测日志**:`Install/Geomative Studio/LOG/detect_gd20_log.txt`
|
||||
2. **通用日志**:`Install/Geomative Studio/LOG/general/YYYYMMDD.txt`
|
||||
3. **文件传输日志**:`LOG/upg_geo_filetrans_log.txt`
|
||||
4. **串口通信日志**:`LOG/commLog.txt`
|
||||
|
||||
### 日志分析步骤
|
||||
1. **确定时间范围**:根据问题发生的时间定位相关日志条目。
|
||||
2. **查找错误关键字**:搜索"failed"、"error"、"exception"等关键字。
|
||||
3. **跟踪操作流程**:按时间顺序分析日志,理解操作的执行流程。
|
||||
4. **关联多个日志**:同时分析多个日志文件,获取完整的故障场景。
|
||||
|
||||
### 常用日志分析命令
|
||||
```bash
|
||||
# 查找所有包含"failed"的日志条目
|
||||
grep -i "failed" *.log
|
||||
|
||||
# 按时间排序日志条目
|
||||
sort -t' ' -k2,2 -k3,3n logfile.txt
|
||||
|
||||
# 统计错误类型
|
||||
grep -i "error" logfile.txt | cut -d']' -f2 | sort | uniq -c
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
|
||||
- [detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt#L1-L4)
|
||||
- [20211110.txt](file://Install/Geomative Studio/LOG/general/20211110.txt#L1-L4)
|
||||
- [upg_geo_filetrans_log.txt](file://LOG/upg_geo_filetrans_log.txt#L1-L3)
|
||||
|
||||
## 设备检测模块工作机制
|
||||
设备检测模块是系统的重要组成部分,负责识别和连接外部设备。
|
||||
|
||||
### 检测流程
|
||||
1. **初始化**:创建`CDetcGD10Dev`实例并打开日志文件。
|
||||
2. **枚举设备**:遍历系统中的所有可移动驱动器。
|
||||
3. **名称匹配**:比较驱动器卷标名称与预定义的设备名称。
|
||||
4. **路径验证**:检查特定目录结构是否存在作为备用检测方法。
|
||||
5. **结果返回**:返回检测到的设备路径或空字符串。
|
||||
|
||||
### 关键代码分析
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始设备检测] --> B[初始化日志文件]
|
||||
B --> C[获取所有逻辑驱动器]
|
||||
C --> D{遍历驱动器}
|
||||
D --> E[检查驱动器类型]
|
||||
E --> F{是否为可移动驱动器?}
|
||||
F --> |是| G[获取卷标名称]
|
||||
F --> |否| H[下一个驱动器]
|
||||
G --> I{名称匹配GD10/GD20?}
|
||||
I --> |是| J[返回驱动器路径]
|
||||
I --> |否| K[检查SD/equipment目录]
|
||||
K --> L{目录存在?}
|
||||
L --> |是| J
|
||||
L --> |否| H
|
||||
H --> D
|
||||
J --> M[检测完成]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
|
||||
|
||||
**Section sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
|
||||
|
||||
## 系统性问题排查流程
|
||||
为了高效解决用户问题,我们推荐以下系统性排查流程:
|
||||
|
||||
### 初步评估
|
||||
1. **收集信息**:了解问题的具体表现、发生时间和频率。
|
||||
2. **检查环境**:确认操作系统版本、硬件配置和网络环境。
|
||||
3. **查看日志**:检查相关日志文件获取初步线索。
|
||||
|
||||
### 分步排查
|
||||
1. **硬件检查**:验证设备物理连接和电源状态。
|
||||
2. **软件检查**:确认驱动程序和应用程序版本。
|
||||
3. **网络检查**:测试网络连通性和DNS解析。
|
||||
4. **配置检查**:验证配置文件的正确性。
|
||||
|
||||
### 高级诊断
|
||||
1. **启用详细日志**:增加日志级别获取更多细节。
|
||||
2. **使用诊断工具**:运行系统内置的诊断工具。
|
||||
3. **重现问题**:在受控环境中尝试重现问题。
|
||||
|
||||
### 解决方案实施
|
||||
1. **选择方案**:根据诊断结果选择最合适的解决方案。
|
||||
2. **实施修复**:执行修复操作并监控结果。
|
||||
3. **验证效果**:确认问题已解决且没有引入新问题。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[用户报告问题] --> B[初步评估]
|
||||
B --> C[分步排查]
|
||||
C --> D[高级诊断]
|
||||
D --> E[解决方案实施]
|
||||
E --> F{问题解决?}
|
||||
F --> |是| G[关闭问题]
|
||||
F --> |否| H[升级支持]
|
||||
H --> I[专家分析]
|
||||
I --> J[制定新方案]
|
||||
J --> E
|
||||
G --> K[结束]
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L661)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L1-L1200)
|
||||
|
||||
## 修复建议
|
||||
基于对系统架构和常见问题的分析,我们提出以下修复建议:
|
||||
|
||||
### 预防性措施
|
||||
1. **定期更新**:保持应用程序和驱动程序为最新版本。
|
||||
2. **配置备份**:定期备份重要配置文件。
|
||||
3. **环境检查**:定期检查系统环境是否符合要求。
|
||||
|
||||
### 常见问题快速修复
|
||||
1. **设备无法连接**:
|
||||
- 重新插拔设备
|
||||
- 重启应用程序
|
||||
- 检查驱动程序
|
||||
|
||||
2. **固件升级失败**:
|
||||
- 检查网络连接
|
||||
- 确保设备电量充足
|
||||
- 以管理员身份运行
|
||||
|
||||
3. **数据传输中断**:
|
||||
- 检查串口连接
|
||||
- 验证通信参数
|
||||
- 重启传输过程
|
||||
|
||||
### 长期改进建议
|
||||
1. **增强错误处理**:改进代码中的错误处理机制,提供更详细的错误信息。
|
||||
2. **完善日志系统**:增加关键操作的日志记录,便于问题追踪。
|
||||
3. **用户界面优化**:在用户界面中显示更友好的错误提示和解决方案建议。
|
||||
|
||||
**Section sources**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L1-L189)
|
||||
- [LicenseUpgrade.cpp](file://cpp/Operator/LicenseUpgrade.cpp#L1-L497)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L1-L1199)
|
||||
@@ -0,0 +1,421 @@
|
||||
# 数据传输问题
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp)
|
||||
- [Zmodem.h](file://h/Zmodem.h)
|
||||
- [FileTransfer.h](file://h/FileTransfer.h)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp)
|
||||
- [http_client.h](file://h/httpClient/http_client.h)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 引言
|
||||
本文件聚焦于Geomative Studio工程中的数据传输问题与实现细节,围绕以下目标展开:
|
||||
- 阐述Zmodem协议传输失败的常见原因与处理策略
|
||||
- 解释HTTP下载超时、断点续传失败等常见问题及修复思路
|
||||
- 基于FileTransfer.cpp与Zmodem.cpp,说明Zmodem工作机制与关键参数配置
|
||||
- 分析HttpDownload.cpp中curl_perform失败的处理逻辑,并结合http_client.h中的异常传播路径
|
||||
- 提供性能优化建议:超时设置、压缩传输、协议选择等
|
||||
- 列举常见错误场景与重试策略,覆盖大文件传输中断、断点续传失败等
|
||||
|
||||
## 项目结构
|
||||
本项目涉及两类主要传输通道:
|
||||
- 串口Zmodem文件传输:通过Zmodem类实现RS232串口上的可靠文件传输
|
||||
- HTTP下载:包含自研基于套接字的多线程下载器与基于libcurl的下载器
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "串口传输"
|
||||
FT["FileTransfer.h"]
|
||||
ZH["Zmodem.h"]
|
||||
ZC["Zmodem.cpp"]
|
||||
CRC16["Crc16.cpp"]
|
||||
CRC32["Crc32.cpp"]
|
||||
end
|
||||
subgraph "HTTP下载"
|
||||
HDH["HttpDownload.h"]
|
||||
HDC["HttpDownload.cpp"]
|
||||
CRL["FileTransfer_crul.cpp"]
|
||||
HCH["http_client.h"]
|
||||
end
|
||||
FT --> ZH --> ZC
|
||||
ZC --> CRC16
|
||||
ZC --> CRC32
|
||||
HDH --> HDC
|
||||
CRL --> HCH
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [FileTransfer.h](file://h/FileTransfer.h#L1-L49)
|
||||
- [Zmodem.h](file://h/Zmodem.h#L1-L143)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L1-L200)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp#L1-L54)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp#L1-L51)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L1-L200)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L1-L120)
|
||||
- [http_client.h](file://h/httpClient/http_client.h#L1-L120)
|
||||
|
||||
章节来源
|
||||
- [FileTransfer.h](file://h/FileTransfer.h#L1-L49)
|
||||
- [Zmodem.h](file://h/Zmodem.h#L1-L143)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
|
||||
## 核心组件
|
||||
- FileTransfer抽象基类:定义了通用的发送/接收接口,派生出Zmodem具体实现
|
||||
- Zmodem类:实现Zmodem协议的发送/接收流程,含帧类型、CRC校验、超时控制、断点续传等
|
||||
- HttpDownload类:基于套接字的多线程HTTP下载器,支持断点续传与进度管理
|
||||
- FileTransfer_crul类:基于libcurl的下载器,支持超时、进度回调、错误缓冲
|
||||
- http_client.h:基于WinHttp的异步HTTP客户端,包含异常类型与错误传播路径
|
||||
|
||||
章节来源
|
||||
- [FileTransfer.cpp](file://cpp/Tools/FileTransfer.cpp#L1-L47)
|
||||
- [FileTransfer.h](file://h/FileTransfer.h#L1-L49)
|
||||
- [Zmodem.h](file://h/Zmodem.h#L1-L143)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L1-L120)
|
||||
- [http_client.h](file://h/httpClient/http_client.h#L1-L120)
|
||||
|
||||
## 架构总览
|
||||
下面的序列图展示了三种典型数据传输路径及其错误处理要点:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as "应用层"
|
||||
participant Z as "Zmodem"
|
||||
participant Port as "串口设备"
|
||||
participant C16 as "CRC16"
|
||||
participant C32 as "CRC32"
|
||||
App->>Z : "开始发送文件"
|
||||
Z->>Port : "发送ZFILE帧"
|
||||
Port-->>Z : "接收ZFILE确认"
|
||||
loop "发送文件内容"
|
||||
Z->>Port : "发送ZDATA帧(带CRC)"
|
||||
Port-->>Z : "返回ZACK/ZRPOS/ZSKIP"
|
||||
alt "ZACK"
|
||||
Z->>Z : "更新传输位置"
|
||||
else "ZRPOS"
|
||||
Z->>Port : "重定位到指定位置"
|
||||
else "ZSKIP"
|
||||
Z-->>App : "跳过文件"
|
||||
end
|
||||
end
|
||||
Z->>Port : "发送ZEOF/ZFIN"
|
||||
Port-->>Z : "确认完成"
|
||||
Z-->>App : "返回结果"
|
||||
Note over Z,C16,C32 : "CRC16/CRC32用于帧与数据校验"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L150-L380)
|
||||
- [Zmodem.h](file://h/Zmodem.h#L1-L143)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp#L1-L54)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp#L1-L51)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as "应用层"
|
||||
participant HD as "HttpDownload"
|
||||
participant Sock as "套接字"
|
||||
participant Srv as "HTTP服务器"
|
||||
App->>HD : "StartHttpTask(任务)"
|
||||
HD->>Sock : "Connect/发送HEAD/GET"
|
||||
Sock-->>HD : "响应头(状态码/长度/重定向)"
|
||||
alt "支持断点续传"
|
||||
HD->>Sock : "Range : bytes=起止-"
|
||||
Sock-->>HD : "206 Partial Content"
|
||||
HD->>HD : "创建分段任务/写入配置"
|
||||
else "不支持续传"
|
||||
HD->>HD : "回退单线程/禁用续传"
|
||||
end
|
||||
par "多线程下载"
|
||||
HD->>Sock : "并发Range请求"
|
||||
Sock-->>HD : "分块数据"
|
||||
HD->>HD : "合并写入/更新进度"
|
||||
end
|
||||
HD-->>App : "完成/失败"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L60-L220)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as "应用层"
|
||||
participant C as "FileTransfer_crul"
|
||||
participant Curl as "libcurl"
|
||||
participant Srv as "HTTP服务器"
|
||||
App->>C : "DownloadFile()"
|
||||
C->>Curl : "curl_easy_init/设置选项"
|
||||
C->>Curl : "curl_easy_perform()"
|
||||
alt "执行成功"
|
||||
Curl-->>C : "返回CURLE_OK"
|
||||
C-->>App : "写入文件/返回成功"
|
||||
else "执行失败"
|
||||
Curl-->>C : "返回错误码/错误缓冲"
|
||||
C->>C : "记录日志/提示用户"
|
||||
C-->>App : "返回失败"
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L150-L280)
|
||||
- [http_client.h](file://h/httpClient/http_client.h#L1-L120)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Zmodem协议传输问题与处理
|
||||
- 关键帧类型与行为
|
||||
- ZFILE:发送文件名与元数据;接收方需确认后进入ZDATA阶段
|
||||
- ZDATA:携带文件数据,支持多种帧尾标志(ZCRCE/ZCRCG/ZCRCQ/ZCRCW),用于不同ACK策略
|
||||
- ZEOF/ZFIN:文件结束与会话结束
|
||||
- ZRPOS:接收方要求发送方重定位到指定偏移
|
||||
- ZSKIP/ZCAN/ZABORT:跳过/取消/中止
|
||||
- 超时与重试
|
||||
- 读取字符与头部时使用超时参数,超时返回TIMEOUT,触发错误计数或终止
|
||||
- 对于TIMEOUT/错误计数超过阈值,返回ZERROR并终止当前文件或会话
|
||||
- 断点续传
|
||||
- 接收方通过发送ZPOS并携带期望位置,若发送方返回ZRPOS则重定位到该位置继续
|
||||
- 发送方在收到ZRPOS时,重置传输位置并继续发送
|
||||
- CRC校验
|
||||
- 发送与接收均使用CRC16/CRC32进行帧头与数据校验,校验失败返回错误并重发
|
||||
- 常见失败场景
|
||||
- 串口缓冲溢出/握手信号干扰(XON/XOFF),导致读取阻塞或丢帧
|
||||
- 接收方未及时ACK,发送方超时重发,最终因累计错误而失败
|
||||
- 文件系统写入失败或磁盘空间不足
|
||||
- 通信波特率/奇偶校验不匹配导致解码错误
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始发送文件"]) --> SendZFILE["发送ZFILE帧"]
|
||||
SendZFILE --> WaitZACK{"收到ZACK/确认?"}
|
||||
WaitZACK --> |否| Retry["重发ZFILE/等待"]
|
||||
Retry --> Timeout{"超时?"}
|
||||
Timeout --> |是| Fail["返回ZERROR/失败"]
|
||||
Timeout --> |否| WaitZACK
|
||||
WaitZACK --> |是| Loop["循环发送ZDATA帧"]
|
||||
Loop --> ACK{"收到ZACK?"}
|
||||
ACK --> |是| UpdatePos["更新传输位置"]
|
||||
ACK --> |否| ZRPOS{"收到ZRPOS?"}
|
||||
ZRPOS --> |是| Seek["重定位到指定偏移"]
|
||||
ZRPOS --> |否| Skip{"收到ZSKIP?"}
|
||||
Skip --> |是| NextFile["跳过文件/下一个"]
|
||||
Skip --> |否| Fail
|
||||
UpdatePos --> Loop
|
||||
Loop --> EOF["发送ZEOF/ZFIN"]
|
||||
EOF --> Done(["完成"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L150-L380)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L504-L551)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L1717-L1746)
|
||||
|
||||
章节来源
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L132-L170)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L170-L220)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L262-L378)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L504-L551)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L558-L779)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L898-L960)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L1717-L1746)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp#L1-L54)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp#L1-L51)
|
||||
|
||||
### HTTP下载超时与断点续传失败
|
||||
- 超时与重定向处理
|
||||
- 发送请求后解析响应头,提取状态码、内容长度、最后修改时间
|
||||
- 对于3xx重定向,解析Location并更新URL;4xx客户端错误直接失败;5xx服务器错误可重试
|
||||
- 使用Range请求探测服务器是否支持断点续传,若返回206则启用分段下载
|
||||
- 断点续传机制
|
||||
- 首次下载创建“.chr”占位文件,按线程数划分区间,写入配置文件
|
||||
- 续传时读取配置文件,比较文件大小一致性,决定是否继续
|
||||
- 下载完成后合并分段并清理临时文件
|
||||
- 常见失败场景
|
||||
- 网络不稳定导致部分线程超时或连接中断
|
||||
- 服务器不支持Range导致无法断点续传,回退单线程
|
||||
- 写入磁盘失败或权限不足
|
||||
- DNS解析失败或IPV4限制导致连接失败
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
S(["开始下载"]) --> Head["发送HEAD请求获取长度/状态"]
|
||||
Head --> Resp{"状态码/长度有效?"}
|
||||
Resp --> |否| Fail["失败/重试(5xx)"]
|
||||
Resp --> |是| Resume{"支持断点续传?"}
|
||||
Resume --> |是| Split["按线程划分区间/写配置"]
|
||||
Resume --> |否| Single["单线程下载/禁用续传"]
|
||||
Split --> Multi["多线程并发Range请求"]
|
||||
Single --> Write["顺序写入"]
|
||||
Multi --> Merge["合并分段/更新进度"]
|
||||
Merge --> Done(["完成"])
|
||||
Write --> Done
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L417-L518)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L520-L663)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L667-L718)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L720-L800)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
|
||||
章节来源
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L60-L220)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L220-L420)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L420-L800)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
|
||||
### libcurl下载器的错误传播与处理
|
||||
- curl_easy_perform失败处理
|
||||
- 执行失败时记录错误码与错误缓冲信息,弹窗提示用户检查网络
|
||||
- 对“写入文件失败”或“写入字节数不匹配”进行日志记录与返回
|
||||
- 支持设置超时、进度回调、错误缓冲、IPV4解析等选项
|
||||
- 重试策略
|
||||
- URL可达性测试采用短超时与多次重试,提升弱网环境下的成功率
|
||||
- 与http_client.h的关系
|
||||
- http_client.h提供基于WinHttp的异步HTTP客户端,包含异常类型与错误传播路径
|
||||
- 两者分别面向不同场景:libcurl更灵活,WinHttp异步回调更复杂但可控
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as "应用层"
|
||||
participant C as "FileTransfer_crul"
|
||||
participant Curl as "libcurl"
|
||||
participant FS as "文件系统"
|
||||
App->>C : "DownloadFile()"
|
||||
C->>Curl : "设置URL/超时/回调/错误缓冲"
|
||||
C->>Curl : "curl_easy_perform()"
|
||||
alt "成功"
|
||||
Curl-->>C : "CURLE_OK"
|
||||
C->>FS : "写入文件"
|
||||
C-->>App : "返回成功"
|
||||
else "失败"
|
||||
Curl-->>C : "错误码/错误缓冲"
|
||||
C->>C : "记录日志/提示用户"
|
||||
C-->>App : "返回失败"
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L150-L280)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L280-L350)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L350-L428)
|
||||
- [http_client.h](file://h/httpClient/http_client.h#L1-L120)
|
||||
|
||||
章节来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L150-L280)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L350-L428)
|
||||
- [http_client.h](file://h/httpClient/http_client.h#L1-L120)
|
||||
|
||||
## 依赖关系分析
|
||||
- Zmodem依赖FileTransfer抽象接口,CRC16/CRC32用于帧与数据校验
|
||||
- HttpDownload依赖套接字与线程模型,配合配置文件实现断点续传
|
||||
- FileTransfer_crul依赖libcurl,提供简单易用的下载接口
|
||||
- http_client.h提供WinHttp异步客户端,适合需要精细错误处理与回调的场景
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FT["FileTransfer.h"] --> ZH["Zmodem.h"]
|
||||
ZH --> ZC["Zmodem.cpp"]
|
||||
ZC --> CRC16["Crc16.cpp"]
|
||||
ZC --> CRC32["Crc32.cpp"]
|
||||
HDH["HttpDownload.h"] --> HDC["HttpDownload.cpp"]
|
||||
CRL["FileTransfer_crul.cpp"] --> HCH["http_client.h"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [FileTransfer.h](file://h/FileTransfer.h#L1-L49)
|
||||
- [Zmodem.h](file://h/Zmodem.h#L1-L143)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L1-L200)
|
||||
- [Crc16.cpp](file://cpp/Tools/Crc16.cpp#L1-L54)
|
||||
- [Crc32.cpp](file://cpp/Tools/Crc32.cpp#L1-L51)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L1-L200)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L1-L120)
|
||||
- [http_client.h](file://h/httpClient/http_client.h#L1-L120)
|
||||
|
||||
章节来源
|
||||
- [FileTransfer.h](file://h/FileTransfer.h#L1-L49)
|
||||
- [Zmodem.h](file://h/Zmodem.h#L1-L143)
|
||||
- [HttpDownload.h](file://h/HttpDownload.h#L1-L155)
|
||||
|
||||
## 性能考量
|
||||
- 超时设置
|
||||
- Zmodem:读取字符/头部超时约10秒量级,可根据波特率动态调整
|
||||
- HttpDownload:HEAD请求短超时快速探测,GET请求长超时保证稳定
|
||||
- FileTransfer_crul:默认超时较长,可在弱网环境下适当缩短
|
||||
- 压缩传输
|
||||
- HTTP侧可协商Accept-Encoding,服务端返回压缩内容时减少带宽占用
|
||||
- Zmodem本身不提供压缩,可通过上层协议或外部工具实现
|
||||
- 协议选择
|
||||
- 高速、稳定网络:优先使用HTTP多线程下载
|
||||
- 低速、高误码串口:优先使用Zmodem,配合CRC32与断点续传
|
||||
- 并发与缓冲
|
||||
- HttpDownload的多线程分段下载可显著提升吞吐,注意磁盘写入与网络拥塞
|
||||
- Zmodem的接收缓冲区大小影响吞吐与延迟,需平衡内存与性能
|
||||
|
||||
[本节为通用指导,无需特定文件引用]
|
||||
|
||||
## 故障排查指南
|
||||
- Zmodem传输失败
|
||||
- 现象:TIMEOUT频繁、ZRPOS重定位失败、CRC校验失败
|
||||
- 排查:检查串口参数(波特率/奇偶/停止位)、握手信号、线缆质量
|
||||
- 处理:增大超时、降低帧大小、启用断点续传、重发失败段
|
||||
- HTTP下载超时
|
||||
- 现象:HEAD/GET超时、状态码非200、服务器不支持Range
|
||||
- 排查:DNS解析、代理设置、防火墙、服务器限速
|
||||
- 处理:缩短超时、增加重试次数、回退单线程、切换IPV4
|
||||
- 文件完整性校验错误
|
||||
- 现象:CRC校验失败、写入字节数不匹配
|
||||
- 排查:磁盘空间、文件权限、写入缓冲区
|
||||
- 处理:重试写入、检查磁盘健康、启用断点续传
|
||||
- curl_perform失败
|
||||
- 现象:返回错误码、错误缓冲有内容
|
||||
- 排查:网络环境、证书验证、URL有效性
|
||||
- 处理:打印错误缓冲、提示用户检查网络、必要时禁用SSL验证(仅测试)
|
||||
|
||||
章节来源
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L898-L960)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L1240-L1267)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L417-L518)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L240-L280)
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L350-L428)
|
||||
|
||||
## 结论
|
||||
- Zmodem协议通过严格的帧类型、CRC校验与断点续传来保障串口传输的可靠性,适用于弱网络与高误码场景
|
||||
- HTTP下载器提供了灵活的断点续传与多线程能力,适合稳定网络环境下的大文件传输
|
||||
- libcurl与WinHttp分别满足不同需求:前者简单易用,后者提供细粒度的异步回调与错误处理
|
||||
- 面向生产环境,建议结合超时策略、重试机制与日志记录,持续优化传输稳定性与性能
|
||||
|
||||
[本节为总结,无需特定文件引用]
|
||||
|
||||
## 附录
|
||||
- 关键参数与配置
|
||||
- Zmodem:接收缓冲区大小、帧尾策略、CRC类型选择、超时阈值
|
||||
- HttpDownload:线程数、分段区间、配置文件路径、写入缓冲
|
||||
- FileTransfer_crul:超时、进度回调、错误缓冲、IPV4解析
|
||||
- 常见错误码参考
|
||||
- libcurl错误码范围与含义可参考curl.h中的枚举定义
|
||||
|
||||
章节来源
|
||||
- [FileTransfer_crul.cpp](file://cpp/Tools/FileTransfer_crul.cpp#L1-L120)
|
||||
- [HttpDownload.cpp](file://cpp/Tools/HttpDownload.cpp#L1-L200)
|
||||
- [Zmodem.cpp](file://cpp/Tools/Zmodem.cpp#L1-L200)
|
||||
@@ -0,0 +1,372 @@
|
||||
# 设备连接问题
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp)
|
||||
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h)
|
||||
- [detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp)
|
||||
- [SComPort_winxp.cpp](file://cpp/Tools/SComPort_winxp.cpp)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h)
|
||||
- [STtube.inf(x64)](file://Install/GD_10/x64/STtube.inf)
|
||||
- [STtube.inf(x86)](file://Install/GD_10/x86/STtube.inf)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构与定位](#项目结构与定位)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能与稳定性考量](#性能与稳定性考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于设备连接失败的常见原因与排查方法,围绕以下主题展开:
|
||||
- 串口通信异常、设备未识别、驱动安装问题、硬件检测超时等
|
||||
- 基于 DetcGD10Dev.cpp 的设备检测逻辑,解释设备发现流程与状态判断机制
|
||||
- 结合 detect_gd20_log.txt 日志内容,说明系统在检测 GD20 设备时的行为模式
|
||||
- 提供详细的排查步骤:检查 COM 端口配置、验证 USB 驱动安装、确认设备供电状态等
|
||||
- 文档化错误代码 EN_InitFailed、EN_InitSendOpen 等的触发条件与解决方案
|
||||
- 为开发人员提供调试建议:启用详细日志、使用诊断工具
|
||||
|
||||
## 项目结构与定位
|
||||
本仓库包含设备检测、串口通信、设备管理、错误码映射、驱动安装包等模块。与设备连接问题直接相关的关键路径如下:
|
||||
- 设备检测:cpp/Operator/DetcGD10Dev.cpp、h/DetcGD10Dev.h
|
||||
- 串口通信:cpp/Tools/SComPort.cpp、cpp/Tools/SComPort_winxp.cpp
|
||||
- 错误码与原因映射:cpp/Main/Global.cpp
|
||||
- 设备管理与链路记录:cpp/Managers/DevManager.cpp、h/DevLinkRecord.h
|
||||
- 驱动安装包:Install/GD_10/x64/STtube.inf、Install/GD_10/x86/STtube.inf
|
||||
- 检测日志:Install/Geomative Studio/LOG/detect_gd20_log.txt
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "设备检测"
|
||||
DGD["DetcGD10Dev<br/>设备检测类"]
|
||||
DLG["detect_gd20_log.txt<br/>检测日志"]
|
||||
end
|
||||
subgraph "串口通信"
|
||||
SCP["SComPort<br/>串口封装"]
|
||||
SCX["SComPort_winxp<br/>兼容实现"]
|
||||
end
|
||||
subgraph "错误与管理"
|
||||
GLOB["Global.cpp<br/>错误码映射"]
|
||||
DM["DevManager<br/>设备管理"]
|
||||
DLR["DevLinkRecord<br/>设备链路记录"]
|
||||
end
|
||||
subgraph "驱动与安装"
|
||||
INF64["STtube.inf(x64)<br/>USB CDC 驱动"]
|
||||
INF86["STtube.inf(x86)<br/>USB CDC 驱动"]
|
||||
end
|
||||
DGD --> DLG
|
||||
DGD --> SCP
|
||||
DGD --> SCX
|
||||
SCP --> GLOB
|
||||
SCX --> GLOB
|
||||
DM --> DLR
|
||||
DM --> DGD
|
||||
INF64 --> DGD
|
||||
INF86 --> DGD
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L93-L223)
|
||||
- [SComPort_winxp.cpp](file://cpp/Tools/SComPort_winxp.cpp#L92-L223)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h#L1-L25)
|
||||
- [STtube.inf(x64)](file://Install/GD_10/x64/STtube.inf#L49-L205)
|
||||
- [STtube.inf(x86)](file://Install/GD_10/x86/STtube.inf#L48-L205)
|
||||
|
||||
章节来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L93-L223)
|
||||
- [SComPort_winxp.cpp](file://cpp/Tools/SComPort_winxp.cpp#L92-L223)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h#L1-L25)
|
||||
- [STtube.inf(x64)](file://Install/GD_10/x64/STtube.inf#L49-L205)
|
||||
- [STtube.inf(x86)](file://Install/GD_10/x86/STtube.inf#L48-L205)
|
||||
|
||||
## 核心组件
|
||||
- 设备检测类(DetcGD10Dev)
|
||||
- 负责 GD20/GD10 设备的发现与连接状态判断;通过扫描可移动磁盘并比对卷标名来识别设备;同时写入检测日志。
|
||||
- 串口通信类(SComPort)
|
||||
- 封装串口打开、参数设置、读写与事件监控;提供 COM 端口枚举、打开、关闭、清空缓冲等能力。
|
||||
- 错误码映射(Global.cpp)
|
||||
- 将内部错误码转换为可读的原因描述,便于用户界面提示与日志分析。
|
||||
- 设备管理(DevManager)
|
||||
- 维护设备链路列表、设备注册状态与 MAC 地址匹配,支撑设备连接后的状态管理。
|
||||
- 驱动安装包(STtube.inf)
|
||||
- 提供 GD10/GD20 设备的 USB CDC 驱动安装信息,确保系统能正确识别设备并分配 COM 端口。
|
||||
|
||||
章节来源
|
||||
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h#L12-L38)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L93-L223)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
|
||||
- [STtube.inf(x64)](file://Install/GD_10/x64/STtube.inf#L49-L205)
|
||||
|
||||
## 架构总览
|
||||
下图展示从“设备检测”到“串口通信”的关键交互路径,以及错误码映射与日志输出的位置。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "界面/调用方"
|
||||
participant DGD as "DetcGD10Dev"
|
||||
participant FS as "文件系统/卷标识别"
|
||||
participant LOG as "检测日志"
|
||||
participant SCP as "SComPort"
|
||||
participant ERR as "错误码映射"
|
||||
UI->>DGD : 调用 DetectGD10Dev()
|
||||
DGD->>FS : 查找可移动磁盘并比对卷标
|
||||
FS-->>DGD : 返回匹配结果或空
|
||||
DGD->>LOG : 写入检测日志
|
||||
alt 已找到设备
|
||||
DGD-->>UI : 连接状态为已连接
|
||||
UI->>SCP : 打开串口并配置参数
|
||||
SCP-->>UI : 串口打开成功/失败
|
||||
alt 失败
|
||||
SCP->>ERR : 映射错误原因
|
||||
ERR-->>UI : 返回可读错误描述
|
||||
end
|
||||
else 未找到设备
|
||||
DGD-->>UI : 连接状态为未连接
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L223)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 设备检测流程与状态判断(DetcGD10Dev)
|
||||
- 关键职责
|
||||
- 获取设备地址:根据应用配置选择 GD20 或 GD10 名称,扫描可移动磁盘,匹配卷标名以识别设备。
|
||||
- 状态标记:若找到设备则置连接状态为已连接,否则为未连接。
|
||||
- 日志记录:统一写入检测日志文件,便于后续分析。
|
||||
- 重要方法
|
||||
- DetectGD10Dev:执行检测主流程,更新连接状态。
|
||||
- FindUsbDevice:遍历逻辑盘符,过滤可移动盘,比对卷标名。
|
||||
- CompareDriverName:获取卷信息并比较卷标名,用于判定是否为目标设备。
|
||||
- PrintLog:格式化时间戳并追加写入日志。
|
||||
- 行为模式(结合日志)
|
||||
- detect_gd20_log.txt 中出现“准备查找 gd20 设备”的日志条目,表明检测入口被调用;当前日志中时间戳为默认值,可能意味着检测未完成或日志写入时机问题。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始 DetectGD10Dev"]) --> ClearAddr["清空设备地址"]
|
||||
ClearAddr --> LogReady["写入检测日志:准备查找 gd20 设备"]
|
||||
LogReady --> ChooseName{"是否多通道设备?"}
|
||||
ChooseName --> |是| UseGD20["使用 GD20 名称"]
|
||||
ChooseName --> |否| UseGD10["使用 GD10 名称"]
|
||||
UseGD20 --> Scan["FindUsbDevice 扫描可移动磁盘"]
|
||||
UseGD10 --> Scan
|
||||
Scan --> Match{"CompareDriverName 匹配卷标?"}
|
||||
Match --> |是| Found["记录设备地址并置连接状态为已连接"]
|
||||
Match --> |否| NotFound["设备地址为空并置连接状态为未连接"]
|
||||
Found --> End(["结束"])
|
||||
NotFound --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
|
||||
章节来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [DetcGD10Dev.h](file://h/DetcGD10Dev.h#L12-L38)
|
||||
- [detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt#L1-L4)
|
||||
|
||||
### 串口通信与超时处理(SComPort)
|
||||
- 关键职责
|
||||
- 枚举 COM 端口、打开串口、设置波特率/数据位/停止位/奇偶校验等参数。
|
||||
- 读写数据采用 OVERLAPPED 异步模型,并进行错误处理与超时控制。
|
||||
- 重要行为
|
||||
- 打开端口失败会返回失败并记录错误码;设置串口参数失败也会回退并返回失败。
|
||||
- 读取数据时若返回 ERROR_IO_PENDING,需等待事件完成;否则记录错误。
|
||||
- 发送数据时若等待事件超时,返回失败。
|
||||
- 超时与异常
|
||||
- 读写等待超时会返回失败,属于典型“硬件检测超时”场景之一。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant APP as "调用方"
|
||||
participant SCP as "SComPort"
|
||||
participant OS as "操作系统串口句柄"
|
||||
APP->>SCP : OpenComm(端口号)
|
||||
SCP->>OS : CreateFile 打开端口
|
||||
OS-->>SCP : 成功/失败
|
||||
alt 失败
|
||||
SCP-->>APP : 返回失败无法打开端口
|
||||
else 成功
|
||||
SCP->>OS : SetupComm 设置缓冲区
|
||||
SCP->>OS : Get/SetCommState 设置参数
|
||||
OS-->>SCP : 成功/失败
|
||||
alt 失败
|
||||
SCP-->>APP : 返回失败参数设置失败
|
||||
else 成功
|
||||
SCP-->>APP : 返回成功
|
||||
APP->>SCP : ReadFile/WriteFile
|
||||
SCP->>OS : 异步读写
|
||||
OS-->>SCP : 成功/失败或 ERROR_IO_PENDING
|
||||
alt 超时/错误
|
||||
SCP-->>APP : 返回失败超时/错误
|
||||
else 成功
|
||||
SCP-->>APP : 返回成功
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L223)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L306-L401)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L527-L576)
|
||||
|
||||
章节来源
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L93-L223)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L306-L401)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L527-L576)
|
||||
|
||||
### 错误码与原因映射(Global.cpp)
|
||||
- 错误码 EN_InitFailed、EN_InitSendOpen 等用于描述初始化阶段的失败类型,便于用户界面显示与日志分析。
|
||||
- 典型触发场景
|
||||
- EN_InitFailed:初始化失败(例如设备未就绪、参数不正确等)
|
||||
- EN_InitSendOpen:发送打开命令阶段失败(例如串口打开失败、命令发送失败等)
|
||||
|
||||
章节来源
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
|
||||
### 设备管理与链路记录(DevManager、DevLinkRecord)
|
||||
- DevManager 维护设备链路列表,支持按 SN/MAC 查询设备,辅助连接后状态管理。
|
||||
- DevLinkRecord 记录设备序列号、名称、型号与 COM 端口等信息,便于后续连接与诊断。
|
||||
|
||||
章节来源
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h#L1-L25)
|
||||
|
||||
## 依赖关系分析
|
||||
- DetcGD10Dev 依赖文件系统扫描与卷标识别,用于“设备未识别”场景的判定。
|
||||
- SComPort 依赖 Windows 串口 API,负责“串口通信异常”场景的底层处理。
|
||||
- Global.cpp 提供错误码映射,贯穿“初始化失败”“发送打开失败”等场景。
|
||||
- DevManager/DevLinkRecord 支撑连接后的状态维护与诊断。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
DGD["DetcGD10Dev"] --> FS["卷标识别"]
|
||||
DGD --> LOG["检测日志"]
|
||||
DGD --> SCP["SComPort"]
|
||||
SCP --> OS["Windows 串口API"]
|
||||
SCP --> ERR["错误码映射"]
|
||||
DM["DevManager"] --> DLR["DevLinkRecord"]
|
||||
DM --> DGD
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L223)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
- [DevManager.cpp](file://cpp/Managers/DevManager.cpp#L1-L200)
|
||||
- [DevLinkRecord.h](file://h/DevLinkRecord.h#L1-L25)
|
||||
|
||||
## 性能与稳定性考量
|
||||
- 设备检测阶段避免频繁重复扫描,可在 UI 层增加去抖动与缓存策略。
|
||||
- 串口读写采用 OVERLAPPED 异步模型,注意合理设置等待超时,避免阻塞主线程。
|
||||
- 日志写入应考虑线程安全与刷盘频率,避免影响性能。
|
||||
|
||||
[本节为通用建议,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
|
||||
### 一、常见连接失败原因与定位
|
||||
- 串口通信异常
|
||||
- 现象:打开串口失败、设置参数失败、读写超时。
|
||||
- 排查要点:确认 COM 端口是否存在、权限是否足够、波特率/数据位/停止位/奇偶校验是否匹配。
|
||||
- 参考实现:串口打开与参数设置、读写超时处理。
|
||||
- 设备未识别
|
||||
- 现象:检测日志显示“准备查找 gd20 设备”,但最终连接状态为未连接。
|
||||
- 排查要点:确认设备是否以可移动磁盘形式挂载、卷标名是否符合预期、驱动是否正确安装。
|
||||
- 参考实现:设备检测与卷标比对、日志写入。
|
||||
- 驱动安装问题
|
||||
- 现象:设备插入后无 COM 端口、设备管理器显示未知设备或黄色感叹号。
|
||||
- 排查要点:使用提供的驱动安装包安装 USB CDC 驱动,确保系统识别设备并分配 COM 端口。
|
||||
- 参考实现:驱动 INF 文件中列出的 VID/PID 与设备描述。
|
||||
- 硬件检测超时
|
||||
- 现象:串口读写等待超时,返回失败。
|
||||
- 排查要点:检查线缆与供电、设备固件状态、串口参数一致性。
|
||||
|
||||
章节来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L223)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L306-L401)
|
||||
- [STtube.inf(x64)](file://Install/GD_10/x64/STtube.inf#L49-L205)
|
||||
- [STtube.inf(x86)](file://Install/GD_10/x86/STtube.inf#L48-L205)
|
||||
|
||||
### 二、详细排查步骤
|
||||
- 步骤1:检查 COM 端口配置
|
||||
- 使用串口枚举功能确认目标 COM 是否存在;核对波特率、数据位、停止位、奇偶校验是否与设备一致。
|
||||
- 参考实现:COM 端口枚举与打开流程。
|
||||
- 步骤2:验证 USB 驱动安装
|
||||
- 在设备管理器中查看对应设备是否正常;若提示需要驱动,请使用安装包中的 INF 安装。
|
||||
- 参考实现:驱动 INF 文件中列出的 VID/PID 与设备描述。
|
||||
- 步骤3:确认设备供电状态
|
||||
- 检查线缆连接是否可靠、电源是否充足;尝试更换 USB 线或接口。
|
||||
- 步骤4:查看检测日志
|
||||
- 打开检测日志文件,确认检测入口是否被调用、卷标识别是否成功。
|
||||
- 参考实现:检测日志写入。
|
||||
- 步骤5:启用详细日志与诊断
|
||||
- 启用串口通信日志,观察打开、读写过程中的错误码与超时情况。
|
||||
- 参考实现:串口读写日志记录。
|
||||
|
||||
章节来源
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L93-L223)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L306-L401)
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L177-L189)
|
||||
- [detect_gd20_log.txt](file://Install/Geomative Studio/LOG/detect_gd20_log.txt#L1-L4)
|
||||
- [STtube.inf(x64)](file://Install/GD_10/x64/STtube.inf#L49-L205)
|
||||
- [STtube.inf(x86)](file://Install/GD_10/x86/STtube.inf#L48-L205)
|
||||
|
||||
### 三、错误代码触发条件与解决方案
|
||||
- EN_InitFailed(初始化失败)
|
||||
- 触发条件:设备初始化阶段整体失败,可能由串口打开失败、参数设置失败、设备未就绪等引起。
|
||||
- 解决方案:检查串口配置与连接、确认设备供电与固件状态、重试初始化流程。
|
||||
- EN_InitSendOpen(发送打开命令失败)
|
||||
- 触发条件:初始化过程中发送打开命令阶段失败,通常发生在串口打开或命令发送环节。
|
||||
- 解决方案:确认串口已成功打开、命令格式正确、无超时或错误码;必要时重新插拔设备并重试。
|
||||
|
||||
章节来源
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
|
||||
## 结论
|
||||
- 设备连接失败通常由“串口通信异常”“设备未识别”“驱动安装问题”“硬件检测超时”四类原因导致。
|
||||
- DetcGD10Dev 的检测流程以卷标识别为核心,结合检测日志可快速定位问题阶段。
|
||||
- SComPort 的串口打开与参数设置是初始化成功的关键,读写超时与错误码是主要线索。
|
||||
- 通过驱动安装包与错误码映射,可有效缩小排查范围并给出针对性修复建议。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 设备检测与串口通信关键路径速查
|
||||
- 设备检测入口:DetectGD10Dev
|
||||
- 卷标识别:FindUsbDevice、CompareDriverName
|
||||
- 日志写入:PrintLog
|
||||
- 串口打开与参数设置:OpenComm
|
||||
- 读写与超时:ReceiveDataDirectly、SendDataDirectly
|
||||
- 错误码映射:错误码到原因字符串的映射函数
|
||||
|
||||
章节来源
|
||||
- [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp#L61-L189)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L127-L223)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L306-L401)
|
||||
- [SComPort.cpp](file://cpp/Tools/SComPort.cpp#L527-L576)
|
||||
- [Global.cpp](file://cpp/Main/Global.cpp#L1490-L1539)
|
||||
@@ -0,0 +1,187 @@
|
||||
# 配置问题
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [config.ini](file://config.ini)
|
||||
- [database_modify.xml](file://database_modify.xml)
|
||||
- [version_info.txt](file://version_info.txt)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp)
|
||||
- [ProManager.h](file://h/ProManager.h)
|
||||
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt)
|
||||
- [project.xml](file://CACHE/project.xml)
|
||||
- [testzone.xml](file://CACHE/testzone.xml)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [配置文件损坏与参数设置错误](#配置文件损坏与参数设置错误)
|
||||
2. [版本不兼容问题](#版本不兼容问题)
|
||||
3. [数据库字段不匹配](#数据库字段不匹配)
|
||||
4. [config.ini配置项详解](#configini配置项详解)
|
||||
5. [database_modify.xml在数据库迁移中的作用](#databasemodifyxml在数据库迁移中的作用)
|
||||
6. [版本信息与配置格式变化](#版本信息与配置格式变化)
|
||||
7. [配置文件备份与恢复最佳实践](#配置文件备份与恢复最佳实践)
|
||||
8. [通过ProManager验证配置有效性](#通过promanager验证配置有效性)
|
||||
9. [配置验证工具使用方法](#配置验证工具使用方法)
|
||||
|
||||
## 配置文件损坏与参数设置错误
|
||||
|
||||
配置文件损坏或参数设置错误可能导致Geomative Studio软件功能异常。`config.ini`文件是系统核心配置文件,其结构损坏(如缺少节段、语法错误)会导致软件无法启动或功能模块失效。参数值设置错误会直接影响系统行为,例如`[ONLINE_DEVICE]`节中的`IP`和`Port`配置错误会导致无法连接远程服务器,`[USER_INFO]`中的`UserID`配置错误会影响用户身份验证。
|
||||
|
||||
`config.ini`文件采用标准的INI文件格式,由多个节(section)组成,每个节包含键值对。文件损坏的常见表现包括:缺少必要的节头(如`[UI]`)、键值对格式错误(缺少等号或值)、编码问题导致的乱码等。这些损坏会导致程序在读取配置时抛出异常或使用默认值,从而引发不可预测的行为。
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L1-L73)
|
||||
|
||||
## 版本不兼容问题
|
||||
|
||||
不同版本的Geomative Studio软件可能存在配置格式的不兼容。`version_info.txt`文件记录了当前软件版本号,而`config.ini`和`database_modify.xml`文件的结构可能随版本升级而发生变化。当使用旧版本的配置文件运行新版本软件时,可能会因为新增的配置项缺失而导致功能异常;反之,新版本的配置文件在旧版本软件中运行则可能因为无法识别新增配置项而忽略相关功能。
|
||||
|
||||
版本不兼容问题还体现在数据库结构上。`database_modify.xml`文件定义了数据库版本迁移规则,当软件版本升级时,如果未正确执行数据库迁移,会导致新版本软件无法访问数据库或数据丢失。例如,新版本可能新增了某些数据表或字段,而旧版本的数据库结构中不存在这些元素,从而导致数据访问错误。
|
||||
|
||||
**Section sources**
|
||||
- [version_info.txt](file://version_info.txt#L1)
|
||||
- [database_modify.xml](file://database_modify.xml#L1-L25)
|
||||
|
||||
## 数据库字段不匹配
|
||||
|
||||
数据库字段不匹配是导致数据访问错误的主要原因之一。`DB/数据库字段修改记录.txt`文件详细记录了数据库结构的变更历史,包括新增字段、修改字段类型和删除字段等操作。如果实际数据库结构与软件期望的结构不一致,会导致数据读写失败。
|
||||
|
||||
例如,2015年6月2日的变更记录显示,在`td2dcon`、`td3dcon`和`td1dcon`表中增加了`bUse`字段用于标记记录有效性。如果数据库未执行此变更,软件在尝试访问`bUse`字段时会抛出"字段不存在"的异常。同样,2017年9月18日将`gr`表中的`ECODE`字段从文本类型改为整型,如果类型未正确修改,会导致数据类型转换错误。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[数据库访问请求] --> B{字段匹配检查}
|
||||
B --> |匹配| C[正常数据读写]
|
||||
B --> |不匹配| D[抛出异常]
|
||||
D --> E[功能异常或崩溃]
|
||||
F[数据库字段修改记录] --> B
|
||||
G[database_modify.xml] --> H[执行数据库迁移]
|
||||
H --> F
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [database_modify.xml](file://database_modify.xml#L1-L25)
|
||||
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt#L1-L61)
|
||||
|
||||
**Section sources**
|
||||
- [数据库字段修改记录.txt](file://DB/数据库字段修改记录.txt#L1-L61)
|
||||
|
||||
## config.ini配置项详解
|
||||
|
||||
`config.ini`文件包含多个配置节,每个节管理不同方面的系统设置。`[UI]`节中的`Language`参数控制界面语言,有效值为1(中文)或2(英文)。`[TRANSFER_INFO]`节定义了软件更新和主页的URL地址。`[ONLINE_DEVICE]`节配置了远程设备连接参数,包括IP地址和端口号。
|
||||
|
||||
`[USER_INFO]`节存储用户身份信息,`UserID`是用户唯一标识,`UserPwd`是密码。`[CROSS_HOLE_CFG]`节配置跨孔测量参数,`Number`表示配置数量,后续的`[CFG_1]`到`[CFG_6]`节定义了具体的孔间距和起始深度。错误配置这些参数会导致测量数据不准确或设备通信失败。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class ConfigSection {
|
||||
+String name
|
||||
+Map<String, String> properties
|
||||
+get(String key) String
|
||||
+set(String key, String value) void
|
||||
}
|
||||
class ConfigManager {
|
||||
+Map<String, ConfigSection> sections
|
||||
+load(String filePath) boolean
|
||||
+save(String filePath) boolean
|
||||
+getSection(String name) ConfigSection
|
||||
}
|
||||
ConfigManager --> ConfigSection : "contains"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [config.ini](file://config.ini#L1-L73)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L32-L1238)
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L1-L73)
|
||||
|
||||
## database_modify.xml在数据库迁移中的作用
|
||||
|
||||
`database_modify.xml`文件是数据库版本迁移的核心配置文件,它定义了从一个版本到另一个版本的数据库结构变更规则。文件中的`current_version`属性指定当前版本号,`pre_version`包含具体的修改指令。每个`<table>`元素定义了对特定数据表的操作,`modify_type`属性值1表示新增表,2表示删除表,3表示修改表。
|
||||
|
||||
`<column>`元素描述了字段的详细属性,包括`value_type`(数据类型)、`attribute_value`(长度或精度)、`is_primary_key`(是否为主键)等。当软件启动时,会检查当前数据库版本与`database_modify.xml`中定义的版本是否一致,如果不一致则自动执行迁移操作,确保数据库结构与软件版本匹配。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as "应用程序"
|
||||
participant DB as "数据库"
|
||||
participant XML as "database_modify.xml"
|
||||
App->>DB : 查询当前数据库版本
|
||||
DB-->>App : 返回版本信息
|
||||
App->>XML : 读取目标版本
|
||||
XML-->>App : 返回版本配置
|
||||
App->>App : 版本比较
|
||||
alt 版本不匹配
|
||||
App->>App : 生成迁移脚本
|
||||
App->>DB : 执行结构变更
|
||||
DB-->>App : 迁移结果
|
||||
App->>App : 更新版本记录
|
||||
end
|
||||
App->>DB : 正常数据操作
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [database_modify.xml](file://database_modify.xml#L1-L25)
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L32-L1238)
|
||||
|
||||
**Section sources**
|
||||
- [database_modify.xml](file://database_modify.xml#L1-L25)
|
||||
|
||||
## 版本信息与配置格式变化
|
||||
|
||||
`version_info.txt`文件中的`geomative_version`参数明确指定了软件版本号,当前版本为2.4.1。不同版本间配置格式存在显著变化,需要特别注意升级时的兼容性问题。例如,早期版本的`config.ini`可能不包含`[PLC_SET]`节,而新版本中该节的`TimeInterval`参数对PLC通信至关重要。
|
||||
|
||||
版本升级时,除了主配置文件外,还需要关注数据库结构的同步更新。`database_modify.xml`文件的版本号应与`version_info.txt`保持一致,否则会导致迁移规则不匹配。建议在升级前备份所有配置文件和数据库,按照版本发布说明逐步执行升级流程,确保配置格式的正确转换。
|
||||
|
||||
**Section sources**
|
||||
- [version_info.txt](file://version_info.txt#L1)
|
||||
- [config.ini](file://config.ini#L1-L73)
|
||||
- [database_modify.xml](file://database_modify.xml#L1-L25)
|
||||
|
||||
## 配置文件备份与恢复最佳实践
|
||||
|
||||
为防止配置文件损坏导致系统无法使用,应建立完善的备份与恢复机制。建议采用多层次备份策略:每日自动备份到本地安全目录,每周备份到外部存储设备,每月备份到云端存储。备份文件应包含时间戳和版本信息,便于追溯和恢复。
|
||||
|
||||
恢复时应遵循"验证-恢复-测试"流程:首先验证备份文件的完整性,然后将其恢复到正确位置,最后启动软件进行功能测试。对于`config.ini`文件,可以创建模板文件,包含所有必要节和参数的默认值,当配置文件损坏时可快速恢复基本功能。
|
||||
|
||||
**Section sources**
|
||||
- [config.ini](file://config.ini#L1-L73)
|
||||
- [project.xml](file://CACHE/project.xml#L1-L23)
|
||||
- [testzone.xml](file://CACHE/testzone.xml#L1-L57)
|
||||
|
||||
## 通过ProManager验证配置有效性
|
||||
|
||||
`ProManager.cpp`中的项目管理逻辑提供了配置有效性验证机制。`CProManager`类负责管理工程和测区的创建、删除和同步操作。通过`CreateProjectInDB`和`CreateProjectInDev`等方法,可以在创建工程时验证配置参数的有效性。
|
||||
|
||||
例如,在创建工程时会检查工程名称是否已存在,避免重复;在创建测区时会验证测区类型是否符合规范。这些验证逻辑确保了配置数据的一致性和完整性。通过调用`ShowProList`和`ShowTzList`方法,可以查询和验证现有配置的状态。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[创建工程请求] --> B{参数验证}
|
||||
B --> |有效| C[检查名称唯一性]
|
||||
C --> |唯一| D[写入数据库]
|
||||
D --> E[同步到设备]
|
||||
E --> F[返回成功]
|
||||
B --> |无效| G[返回错误]
|
||||
C --> |重复| G
|
||||
D --> |失败| G
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [ProManager.h](file://h/ProManager.h#L30-L74)
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L249-L317)
|
||||
- [ProManager.h](file://h/ProManager.h#L30-L74)
|
||||
|
||||
## 配置验证工具使用方法
|
||||
|
||||
配置验证工具可通过调用`ProManager`类的公共接口来实现。使用方法包括:首先初始化`CProManager`实例并传入数据库连接,然后调用`GetDMS`方法获取数据管理结构,最后通过`ShowProList`和`ShowTzList`等方法验证配置数据的完整性和一致性。
|
||||
|
||||
对于批量验证,可以使用`InitialOpDMSTreeForSyn`方法初始化同步树,遍历所有工程和测区进行系统性检查。验证结果可以通过返回码判断:`APP_SUCCESS`表示验证通过,`APP_FAIL`表示验证失败,`APP_DUPLICATE`表示存在重复项。建议将验证工具集成到软件启动流程中,实现自动化的配置检查。
|
||||
|
||||
**Section sources**
|
||||
- [ProManager.cpp](file://cpp/Managers/ProManager.cpp#L153-L1238)
|
||||
- [ProManager.h](file://h/ProManager.h#L30-L74)
|
||||
Reference in New Issue
Block a user