372 lines
16 KiB
Markdown
372 lines
16 KiB
Markdown
# 设备连接问题
|
||
|
||
<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) |