8.6 KiB
设备连接与注册
**本文档引用的文件** - [DevManager.cpp](file://cpp/Managers/DevManager.cpp) - [DevManager.h](file://h/DevManager.h) - [SComPort.cpp](file://cpp/Tools/SComPort.cpp) - [SComPort.h](file://h/SComPort.h) - [Device.cpp](file://cpp/ProblemZone/Device.cpp) - [Device.h](file://h/Device.h) - [DetcGD10Dev.cpp](file://cpp/Operator/DetcGD10Dev.cpp) - [DetcGD10Dev.h](file://h/DetcGD10Dev.h) - [GD10OperCmd.cpp](file://cpp/Tools/GD10OperCmd.cpp) - [GD10OperCmd.h](file://h/GD10OperCmd.h) - [Global.cpp](file://cpp/Main/Global.cpp)目录
引言
本文档详细阐述了GeomativeStudio软件中设备连接与注册功能的实现机制。核心组件CDevManager负责管理所有设备的生命周期,通过SComPort类与GD10设备建立串口通信,实现设备的自动检测、握手、注册和数据同步。文档将深入分析从物理连接检测到设备对象在内存中创建并注册的完整流程。
设备连接与枚举
设备连接的起点是检测物理设备的存在。系统通过CDetcGD10Dev类来检测连接的GD10设备。
flowchart TD
A[开始检测设备] --> B[枚举所有逻辑驱动器]
B --> C{驱动器类型为可移动磁盘?}
C --> |是| D[获取驱动器卷标]
D --> E{卷标为"GD10"或"GD20"?}
E --> |是| F[记录设备地址]
E --> |否| G[检查是否存在\\SD\\equipment目录]
G --> |存在| F
G --> |不存在| H[继续下一个驱动器]
C --> |否| H
H --> I{遍历完所有驱动器?}
I --> |否| B
I --> |是| J[返回设备地址]
Diagram sources
Section sources
串口通信建立
一旦检测到设备,CDevManager会通过SComPort类建立串口通信。SComPort的OpenComm方法负责初始化串口。
sequenceDiagram
participant CDevManager as CDevManager
participant SComPort as SComPort
participant OS as 操作系统
CDevManager->>SComPort : OpenComm("COM3")
SComPort->>OS : CreateFile("\\\\.\\COM3")
OS-->>SComPort : 返回设备句柄
SComPort->>SComPort : SetupComm(设置缓冲区大小)
SComPort->>SComPort : GetCommState(获取当前配置)
SComPort->>SComPort : 配置DCB结构体
SComPort->>SComPort : SetCommState(应用配置)
SComPort->>SComPort : SetCommMask(设置事件掩码)
SComPort-->>CDevManager : 返回TRUE(成功)
Diagram sources
Section sources
设备注册与数据初始化
当设备通过串口成功连接后,需要进行注册,将设备的物理信息同步到本地数据库。
设备信息读取
CDevice类的GetDevInfo方法负责从GD10设备读取其硬件和固件信息。
flowchart TD
A[调用GetDevInfo] --> B[发送"device_ex_info()"命令]
B --> C[等待设备响应]
C --> D{收到响应?}
D --> |是| E[解析响应数据]
E --> F[提取硬件版本(HWV)]
E --> G[提取固件版本(SWV)]
E --> H[提取生产日期(Mdate)]
E --> I[提取批次号(Mbatch)]
F --> J[更新CDevice对象属性]
G --> J
H --> J
I --> J
J --> K[将信息写入本地数据库]
K --> L[返回成功]
D --> |否| M[返回失败]
Diagram sources
Section sources
设备注册流程
设备信息读取成功后,CDevManager会调用AddDevice方法将设备正式注册到系统中。
classDiagram
class CDevManager {
+AddDevice(CDevice* pDev)
+InitialDevLinkList()
+GetDeviceByID(DWORD dwDevID)
}
class CDevice {
+m_szDevSN
+m_szModelNO
+m_szHWV
+m_szSWV
+m_uState
+m_dwID
}
class _ConnectionPtr {
+BeginTrans()
+CommitTrans()
+RollbackTrans()
}
CDevManager --> CDevice : 持有
CDevManager --> _ConnectionPtr : 使用
CDevManager --> CDevice : 注册
Diagram sources
Section sources
CDevice对象与链表管理
CDevManager使用一个链表m_devLinkList来管理所有已注册的设备对象。
对象创建与注册
当一个新设备被发现时,CDevManager会创建一个CDevice对象,并将其添加到链表中。
sequenceDiagram
participant CDevManager as CDevManager
participant CDevice as CDevice
participant LinkList as CLinkList
CDevManager->>CDevice : new CDevice()
CDevice-->>CDevManager : 返回指针
CDevManager->>CDevManager : m_handleProcessor.GenerateHandle()
CDevManager->>LinkList : m_devLinkList.Add(句柄, CDevice指针)
LinkList-->>CDevManager : 添加成功
Diagram sources
Section sources
链表管理机制
CLinkList类提供了对设备对象的增删查改操作,CDevManager通过设备ID或句柄来访问特定的CDevice对象。
classDiagram
class CLinkList {
+Add(DWORD handle, CDevice* pDev)
+Delete(DWORD handle)
+Delete(CDevice* pDev)
+Get(DWORD handle) CDevice*
+Find(int index) CDevice*
+Length() int
+DeleteAll()
}
class CDevice {
+m_dwID
+m_szDevSN
+m_uState
}
CLinkList "1" --> "*" CDevice : 包含
Diagram sources
Section sources
连接状态与通知机制
系统通过CDevice对象的m_uState属性来跟踪设备的连接状态,并通过UI层进行通知。
状态变更流程
设备的状态会随着连接过程而改变,从PZ_STATE_NEW到PZ_STATE_ONLINE。
stateDiagram-v2
[*] --> PZ_STATE_OFFLINE
PZ_STATE_OFFLINE --> PZ_STATE_NEW : 设备被发现
PZ_STATE_NEW --> PZ_STATE_ONLINE : 注册成功
PZ_STATE_NEW --> PZ_STATE_OFFLINE : 注册失败
PZ_STATE_ONLINE --> PZ_STATE_OFFLINE : 连接断开
Diagram sources
Section sources
UI层响应
当设备状态发生变化时,UI层会更新设备列表视图,显示最新的设备信息。
sequenceDiagram
participant CDevice as CDevice
participant CDevManager as CDevManager
participant UI as UI界面
CDevice->>CDevice : SetState(PZ_STATE_ONLINE)
CDevice->>CDevManager : 通知状态变更
CDevManager->>UI : 发送WM_DEVICE_STATE_CHANGED消息
UI->>UI : 更新设备列表
UI->>UI : 刷新设备详细信息
Diagram sources
Section sources
常见问题与解决方案
在设备连接过程中可能会遇到各种问题,系统提供了相应的处理机制。
连接超时
如果在规定时间内未能收到设备的响应,则判定为连接超时。
解决方案:
- 检查设备电源是否开启。
- 检查USB线缆是否连接牢固。
- 尝试更换USB端口或线缆。
- 重启设备和软件。
端口占用
如果目标串口已被其他程序占用,则无法打开。
解决方案:
- 关闭可能占用该串口的其他程序(如串口调试助手)。
- 在设备管理器中检查端口状态。
- 重启计算机以释放所有端口。
协议不匹配
如果设备固件版本过低,可能不支持当前软件的通信协议。
解决方案:
- 检查设备固件版本。
- 使用
IAP-GD10.bat工具对设备进行固件升级。 - 确保软件版本与设备固件版本兼容。
结论
GeomativeStudio的设备连接与注册功能通过CDevManager、SComPort和CDevice等核心类协同工作,实现了从物理设备检测、串口通信建立、设备信息读取、数据库注册到UI状态更新的完整流程。该设计具有良好的模块化和可维护性,能够稳定地管理GD10设备的连接生命周期。