9.7 KiB
设备连接与发现
**本文档引用的文件** - [devmngframe.cpp](file://cpp/Views/devmngframe.cpp) - [DevManager.cpp](file://cpp/Managers/DevManager.cpp) - [DialFindComShow.cpp](file://cpp/Views/DialFindComShow.cpp) - [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp) - [SComPort.cpp](file://cpp/Tools/SComPort.cpp) - [CtrlProtocolDef.h](file://h/CtrlProtocolDef.h) - [DevManager.h](file://h/DevManager.h) - [DetcGD10Dev.h](file://h/DetcGD10Dev.h) - [SComPort.h](file://h/SComPort.h) - [DevOperator.h](file://h/DevOperator.h)目录
引言
本文档深入文档化GeomativeStudio软件中设备连接与发现功能的实现机制。重点描述了串口扫描、设备识别协议(GD10)和通信建立流程。详细解释了CDevMngFrame中OnRefreshNavDevice消息处理如何触发设备列表更新,以及DialFindComShow对话框在串口配置中的作用。提供了用户操作指南,涵盖手动/自动设备发现、串口参数设置与连接测试。为开发者说明了如何扩展支持新型设备型号、修改设备识别逻辑或集成网络设备发现协议(如UDP广播)。结合DevManager的设备枚举接口,阐述了底层通信层与UI层的数据同步机制。
项目结构
GeomativeStudio项目是一个用于地质勘探设备管理的桌面应用程序。项目结构清晰,主要分为以下几个部分:
- CACHE: 缓存文件目录
- DB: 数据库相关文件
- Install: 安装包和部署文件
- LOG: 日志文件目录
- Release: 发布版本文件
- cpp: C++源代码目录,包含主要的业务逻辑
- h: C++头文件目录
- res: 资源文件目录
- tools: 工具脚本
核心的设备连接与发现功能主要实现在cpp/Managers、cpp/Operator和cpp/Tools目录下的源文件中。
核心组件
设备连接与发现功能的核心组件包括:
- CDevManager: 设备管理器,负责设备的增删改查和状态管理
- CDetcGD10Dev: GD10设备检测器,负责通过USB接口发现和连接GD10设备
- CSComPort: 串口通信类,提供底层串口读写功能
- CDevMngFrame: 设备管理框架窗口,处理UI与设备管理的交互
- CDevOperator: 设备操作员,协调UI和设备管理器之间的操作
这些组件共同协作,实现了从设备发现、连接到参数配置的完整流程。
本文档引用的文件
- devmngframe.cpp
- DevManager.cpp
- DetcGD10Dev.cpp
- SComPort.cpp
- DevManager.h
- DetcGD10Dev.h
- SComPort.h
- DevOperator.h
架构概述
设备连接与发现功能的架构可以分为三层:用户界面层、业务逻辑层和通信层。
graph TB
subgraph "用户界面层"
UI[CDevMngFrame]
Dialog[DialFindComShow]
end
subgraph "业务逻辑层"
Operator[CDevOperator]
Manager[CDevManager]
end
subgraph "通信层"
Detector[CDetcGD10Dev]
ComPort[CSComPort]
Protocol[CtrlProtocolDef]
end
UI --> Operator
Operator --> Manager
Manager --> Detector
Detector --> ComPort
ComPort --> Protocol
本文档引用的文件
详细组件分析
CDevMngFrame分析
CDevMngFrame是设备管理的主框架窗口,负责处理用户界面与设备管理功能的交互。
消息处理机制
CDevMngFrame通过Windows消息机制与系统其他部分通信。关键的消息处理函数包括:
sequenceDiagram
participant User as "用户"
participant UI as "CDevMngFrame"
participant Operator as "CDevOperator"
participant Manager as "CDevManager"
User->>UI : 点击"刷新设备"
UI->>UI : 发送WM_REFRESH_NAV_DEVICE消息
UI->>Operator : 调用InitialNavDevView()
Operator->>Manager : 获取设备列表
Manager-->>Operator : 返回设备列表
Operator-->>UI : 更新设备树
UI-->>User : 显示更新后的设备列表
本文档引用的文件
OnRefreshNavDevice消息处理
当收到WM_REFRESH_NAV_DEVICE消息时,CDevMngFrame会触发设备列表的更新。这个过程是设备发现和状态同步的核心。
flowchart TD
Start([开始]) --> CheckNull["检查m_pNavDevView和m_pDevOperator是否为空"]
CheckNull --> |否| CallInitial["调用m_pDevOperator->InitialNavDevView()"]
CallInitial --> UpdateTree["更新设备树视图"]
UpdateTree --> End([结束])
CheckNull --> |是| ShowError["显示错误消息"]
ShowError --> End
本文档引用的文件
CDetcGD10Dev分析
CDetcGD10Dev类负责GD10设备的检测和连接,是设备发现功能的核心。
设备检测流程
CDetcGD10Dev通过枚举系统中的可移动驱动器来发现GD10设备。
flowchart TD
Start([开始]) --> GetDrivers["获取所有逻辑驱动器"]
GetDrivers --> LoopDrivers["遍历每个驱动器"]
LoopDrivers --> IsRemovable["是否为可移动驱动器?"]
IsRemovable --> |是| GetVolumeInfo["获取卷信息"]
GetVolumeInfo --> CompareName["卷名是否为GD10/GD20?"]
CompareName --> |是| FoundDevice["找到设备,返回驱动器路径"]
CompareName --> |否| CheckSDFolder["检查是否存在\\SD\\equipment目录"]
CheckSDFolder --> |存在| FoundDevice
CheckSDFolder --> |不存在| NextDriver["下一个驱动器"]
IsRemovable --> |否| NextDriver
NextDriver --> LoopDrivers
FoundDevice --> End([结束])
LoopDrivers --> |所有驱动器检查完毕| End
本文档引用的文件
CSComPort分析
CSComPort类提供了底层串口通信功能,是设备通信的基础。
串口初始化流程
CSComPort在打开串口时会进行一系列配置,确保通信的稳定性和可靠性。
flowchart TD
Start([开始]) --> CheckHandle["检查串口句柄是否已打开"]
CheckHandle --> |否| SetComName["设置串口名称"]
SetComName --> CreateFile["创建串口文件句柄"]
CreateFile --> |成功| SetupComm["设置通信缓冲区"]
SetupComm --> GetCommState["获取当前通信状态"]
GetCommState --> SetBaudRate["设置波特率为115200"]
SetBaudRate --> SetDataBits["设置数据位为8"]
SetDataBits --> SetParity["设置无奇偶校验"]
SetParity --> SetStopBits["设置停止位为1"]
SetStopBits --> SetCommState["应用通信设置"]
SetCommState --> SetCommMask["设置事件掩码"]
SetCommMask --> End([结束])
CreateFile --> |失败| ReturnFalse["返回FALSE"]
ReturnFalse --> End
本文档引用的文件
依赖分析
设备连接与发现功能的组件之间存在明确的依赖关系。
classDiagram
class CDevMngFrame {
+CDevOperator* m_pDevOperator
+OnRefreshNavDevice()
+PreNetResponse()
}
class CDevOperator {
+CDevManager* m_pDevManager
+InitialNavDevView()
+ShowOLDeviceInfo()
}
class CDevManager {
+CLinkList<CDevice*> m_devLinkList
+InitialDevLinkList()
+AddDevice()
+DeleteDevice()
}
class CDetcGD10Dev {
+static CDetcGD10Dev* m_pDetcDev
+DetectGD10Dev()
+GetGD10DevAddr()
}
class CSComPort {
+HANDLE m_hCom
+OpenComm()
+SendDataDirectly()
+ReceiveDataDirectly()
}
CDevMngFrame --> CDevOperator : "使用"
CDevOperator --> CDevManager : "使用"
CDevManager --> CDetcGD10Dev : "使用"
CDetcGD10Dev --> CSComPort : "使用"
本文档引用的文件
性能考虑
设备连接与发现功能在设计时考虑了以下性能因素:
- 异步通信: 使用重叠I/O(Overlapped I/O)实现异步串口通信,避免阻塞UI线程
- 缓存机制: CDevManager维护设备链表缓存,减少数据库访问频率
- 批量操作: 设备列表更新采用批量处理,减少UI重绘次数
- 资源管理: 及时释放串口句柄和内存资源,防止资源泄漏
故障排除指南
常见问题及解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法发现GD10设备 | 设备未正确连接或驱动未安装 | 检查USB连接,安装正确的驱动程序 |
| 串口通信失败 | 波特率或参数设置不匹配 | 确认设备和软件的串口参数一致 |
| 设备列表不更新 | 消息处理异常 | 重启软件或检查日志文件 |
| 连接超时 | 设备响应慢或网络问题 | 延长超时时间或检查设备状态 |
本文档引用的文件
结论
GeomativeStudio的设备连接与发现功能通过分层架构实现了稳定可靠的设备管理。从底层的串口通信到上层的UI交互,各组件职责明确,协作良好。系统支持自动和手动设备发现,提供了完整的设备生命周期管理功能。通过理解本文档描述的实现机制,用户可以更好地使用该功能,开发者也可以在此基础上进行功能扩展和优化。