# OpticalModuleTester **Repository Path**: hopefully-2023/OpticalModuleTester ## Basic Information - **Project Name**: OpticalModuleTester - **Description**: Optical Module Tester based on CSharp WinForms - **Primary Language**: C# - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-09 - **Last Updated**: 2026-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OpticalModuleTester **光模块参数测试与固件烧录系统 V1.0** > 基于 C# WinForms 的光模块参数测试与固件烧录工具,支持串口通信、自动化测试、固件升级及数据查询管理,适用于光通信行业生产线及实验室场景。 --- ## 📸 系统架构 ``` Program.Main() └── LoginForm (启动窗体 — 用户认证) ├── [登录成功] → MainForm (主界面 — 菜单导航中心) │ ├── 系统管理 → 退出登录 │ ├── 设备连接 → SerialPortForm (串口通信管理) │ ├── 参数测试 → TestForm (光模块参数测试) │ ├── 固件烧录 → FirmwareForm (固件升级烧录) │ │ └── 依赖串口连接 (SerialPortForm.serialPort) │ └── 数据查询 → QueryForm (综合数据查询) └── [取消] → 退出程序 ``` 所有子窗体通过 `new XxxForm().Show()` 非模态打开,可同时存在多个实例。 串口对象 `SerialPortForm.serialPort` 为 `public static` 全局共享,FirmwareForm 在烧录前检查其 `IsOpen` 状态。 --- ## ✨ 功能特性 ### 1. 用户登录认证 (`LoginForm`) - 基于 SQL Server `Users` 表的账号密码验证(参数化查询防注入) - 空值校验 + 错误提示 - 全局异常处理:未捕获异常时强制退出,防止进程残留 ### 2. 串口连接管理 (`SerialPortForm`) - 自动枚举可用 COM 口 - 可配置参数: - **波特率**:9600 / 19200 / 38400 / 57600 / 115200(默认 9600) - **数据位**:5 / 6 / 7 / 8(默认 8) - **停止位**:1 / 1.5 / 2(默认 1) - **校验位**:固定无校验 (Parity.None) - 异步数据接收(`DataReceived` 事件),使用 `StringBuilder` 缓冲区处理粘包 - 跨线程 UI 更新(`Invoke` 模式) - 发送数据自动追加 `\r\n` 结束符 ### 3. 光模块参数测试 (`TestForm`) - 一键测试 5 项关键参数,自动生成模块序列号 - **自动判定阈值**(光模块行业标准): | 参数 | 合格范围 | 单位 | |------|----------|------| | 发射光功率 (TxPower) | 1.0 ~ 2.0 | dBm | | 接收光功率 (RxPower) | -0.5 ~ 0.5 | dBm | | 工作电压 (Voltage) | 3.2 ~ 3.6 | V | | 工作电流 (Current) | 1.0 ~ 3.0 | mA | | 工作温度 (Temperature) | 25 ~ 45 | ℃ | - 5 项参数全部合格才判定为"合格",否则"不合格" - 测试结果颜色标识:✅ 合格=绿色,❌ 不合格=红色 - 支持 CSV 导出(UTF-8 编码,解决 Excel 中文乱码) ### 4. 固件烧录升级 (`FirmwareForm`) - 支持 `.bin` / `.hex` 固件文件选择 - 显示文件信息:路径、大小 (KB)、修改时间 - 后台线程执行烧录(不阻塞 UI) - 实时进度条 + 百分比显示 - 烧录日志窗口(黑底绿字,带时间戳 `[HH:mm:ss]`) - 支持中途取消(`CancellationTokenSource`) - 完成后自动校验固件完整性 - 前置检查:文件路径非空 + 串口已连接 ### 5. 综合数据查询 (`QueryForm`) - 双 Tab 页:参数测试记录 / 固件烧录记录 - 查询条件:日期范围(默认最近 7 天)+ 模块序列号模糊搜索 - 日期范围精确到当天结束(23:59:59) - Tab 切换自动刷新数据 - 结果颜色标识:合格/成功=绿色,不合格/失败=红色 --- ## 🗄️ 数据库设计 **数据库**:SQL Server Express (`.\SQLEXPRESS`) **库名**:`OpticalModuleDB` **认证方式**:Windows 集成认证 ### 建表 SQL ```sql CREATE DATABASE OpticalModuleDB; GO USE OpticalModuleDB; GO -- 用户表 CREATE TABLE Users ( UserName NVARCHAR(50) PRIMARY KEY, UserPwd NVARCHAR(100) NOT NULL ); -- 测试记录表 CREATE TABLE ModuleTestData ( TestId INT IDENTITY(1,1) PRIMARY KEY, ModuleSN NVARCHAR(50), -- 模块序列号 (如 SFP10G-483921) TxPower FLOAT, -- 发射功率 (dBm) RxPower FLOAT, -- 接收功率 (dBm) Voltage FLOAT, -- 工作电压 (V) WorkingCurrent FLOAT, -- 工作电流 (mA) Temperature INT, -- 工作温度 (℃) TestResult NVARCHAR(10), -- 测试结果 ("合格"/"不合格") TestTime DATETIME DEFAULT GETDATE() ); -- 烧录记录表 CREATE TABLE FirmwareBurnRecord ( BurnId INT IDENTITY(1,1) PRIMARY KEY, ModuleSN NVARCHAR(50), -- 模块序列号 OldVersion NVARCHAR(20), -- 原固件版本 (如 V0.9.0) NewVersion NVARCHAR(20), -- 新固件版本 (如 V1.0.0) BurnResult NVARCHAR(10), -- 烧录结果 ("成功"/"失败") BurnTime DATETIME DEFAULT GETDATE() ); -- 默认管理员账号 INSERT INTO Users VALUES ('admin', 'admin123'); ``` ### SQL 操作汇总 | 操作 | SQL | 使用场景 | |------|-----|----------| | 用户登录 | `SELECT COUNT(*) FROM Users WHERE UserName=@UserName AND UserPwd=@UserPwd` | LoginForm | | 插入测试记录 | `INSERT INTO ModuleTestData(...) VALUES(...)` | TestForm | | 查询测试记录 | `SELECT * FROM ModuleTestData ORDER BY TestTime DESC` | TestForm | | 条件查询测试 | `SELECT * FROM ModuleTestData WHERE TestTime BETWEEN @Start AND @End [AND ModuleSN LIKE @ModuleSN]` | QueryForm | | 插入烧录记录 | `INSERT INTO FirmwareBurnRecord(...) VALUES(...)` | FirmwareForm | | 查询烧录记录 | `SELECT * FROM FirmwareBurnRecord ORDER BY BurnTime DESC` | FirmwareForm | | 条件查询烧录 | `SELECT * FROM FirmwareBurnRecord WHERE BurnTime BETWEEN @Start AND @End [AND ModuleSN LIKE @ModuleSN]` | QueryForm | --- ## 📁 项目结构 ``` OpticalModuleTester/ ├── Program.cs # 程序入口 (全局异常处理 + 启动 LoginForm) ├── LoginForm.cs # 登录窗体 (用户认证) ├── MainForm.cs # 主窗体 (菜单导航中心) ├── SerialPortForm.cs # 串口通信管理 (COM 口配置 + 数据收发) ├── TestForm.cs # 光模块参数测试 (5 项参数 + 自动判定) ├── FirmwareForm.cs # 固件烧录升级 (后台线程 + 进度条 + 取消) ├── QueryForm.cs # 综合数据查询 (双 Tab 页 + 条件筛选) ├── SqlHelper.cs # 数据库帮助类 (ExecuteNonQuery/Query/Scalar) ├── App.config # 应用配置 (.NET 4.8 + 程序集绑定重定向) ├── packages.config # NuGet 依赖清单 ├── OpticalModuleTester.csproj # 项目文件 ├── OpticalModuleTester.sln # 解决方案文件 ├── .gitignore # Git 忽略规则 ├── README.md # 项目说明文档 └── Properties/ ├── AssemblyInfo.cs # 程序集元数据 (版本 1.0.0.0, Copyright 2026) ├── Resources.Designer.cs # 资源文件 └── Settings.Designer.cs # 设置文件 ``` --- ## 🛠️ 技术栈 | 类别 | 技术 | 说明 | |------|------|------| | 框架 | .NET Framework 4.8 | 运行时目标框架 | | UI | WinForms | Windows 桌面窗体应用 | | 语言 | C# | 主要开发语言 | | 数据库 | SQL Server Express | 数据持久化 (`.\SQLEXPRESS`) | | 串口通信 | System.IO.Ports | 光模块硬件通信 | | 数据库访问 | System.Data.SqlClient 4.9.1 | ADO.NET 数据库操作 | | Excel 操作 | NPOI 2.8.0 | 文件操作库(预留) | | 数学计算 | MathNet.Numerics 5.0.0 | 数值计算库(预留) | | 加密库 | BouncyCastle.Cryptography 2.6.2 | 加密算法库(预留) | | 图形渲染 | SkiaSharp 3.119.2 | 2D 图形库(预留) | | 字符串优化 | ZString 2.6.0 | 零分配字符串拼接(预留) | > **注**:标注"预留"的库已引入但当前代码未直接使用,为后续功能扩展(如固件签名验证、xlsx 导出、数据分析图表等)做准备。 --- ## 🖥️ 环境要求 | 项目 | 要求 | |------|------| | 操作系统 | Windows 10 / 11 | | 开发工具 | Visual Studio 2019 或更高版本 | | 运行框架 | .NET Framework 4.8 | | 数据库 | SQL Server Express(默认实例 `.\SQLEXPRESS`) | --- ## 🚀 快速开始 ### 1. 克隆仓库 ```bash git clone https://gitee.com/hopefully-2023/OpticalModuleTester.git ``` ### 2. 配置数据库 在 SQL Server 中执行上述「建表 SQL」创建数据库和表。 ### 3. 配置连接字符串 数据库连接字符串硬编码在 `SqlHelper.cs` 中: ```csharp private static string connStr = @"Data Source=.\SQLEXPRESS;Initial Catalog=OpticalModuleDB;Integrated Security=True"; ``` 如需修改数据库实例名或认证方式,请编辑此行。 ### 4. 打开项目 用 Visual Studio 打开 `OpticalModuleTester.sln`,还原 NuGet 包(通常自动还原)。 ### 5. 运行 按 `F5` 启动调试,默认管理员账号:`admin` / `admin123` --- ## ⚠️ 设计说明与注意事项 | 项目 | 说明 | |------|------| | **测试数据** | TestForm 的测试数据和 FirmwareForm 的烧录过程当前为**随机模拟**,代码中预留了真实串口读取的替换点 | | **密码安全** | 密码为明文存储和比对,不适合生产环境,建议后续改为哈希加密 | | **连接字符串** | 硬编码在 SqlHelper.cs 中,未外部化到 App.config,建议后续提取为配置项 | | **串口粘包** | `receiveBuffer` 缓冲区已就位但未做协议帧解析,实际接入设备时需补充解析逻辑 | | **线程安全** | FirmwareForm 和 SerialPortForm 使用 `Invoke` 模式进行跨线程 UI 更新 | | **退出策略** | MainForm 关闭时自动关闭串口和所有子窗体,使用 `Environment.Exit(0)` 确保进程终止 | --- ## 📄 许可证 本项目仅供学习与内部使用,请勿用于商业用途。 --- ## 👤 作者 **hopefully-2023** — [Gitee 主页](https://gitee.com/hopefully-2023)