基于 Rust + Slint 的 ASTM E1381/E1394 协议 LIS 模拟器,模拟实验室信息系统端接收医疗检验仪器的串口数据。
- 语言: Rust (edition 2021)
- UI: Slint 1.15 (fluent 风格)
- 串口: serialport 4.x
- 测试: Python 3 + pyserial (集成测试脚本)
├── Cargo.toml # 项目配置 (lib + bin)
├── build.rs # Slint 编译配置
├── settings/
│ ├── protocol.json # 协议配置 (帧格式、校验和)
│ └── query_responses.json # 查询应答配置
├── images/
│ ├── astm_handshake.svg # 握手流程图
│ ├── astm_frame_format.svg # 帧格式图
│ └── astm_record_types.svg # 数据区记录格式图
├── ui/
│ └── main.slint # UI 界面定义
├── src/
│ ├── lib.rs # 库入口 (导出 astm, serial, state, config)
│ ├── main.rs # 二进制入口
│ ├── config.rs # 协议配置加载
│ ├── headless.rs # 无头模式 (TCP 服务)
│ ├── app/
│ │ ├── mod.rs # app 模块
│ │ ├── callbacks.rs # UI 回调绑定
│ │ └── ui_update.rs # UI 更新函数
│ ├── astm/
│ │ ├── mod.rs # ASTM 协议模块
│ │ ├── control.rs # 控制字符 (ENQ/ACK/NAK/EOT)
│ │ ├── frame.rs # 帧解析/构建/校验和
│ │ └── record.rs # 记录解析 (H/P/O/R/Q/C/L)
│ ├── serial/
│ │ ├── mod.rs # 串口模块
│ │ └── port.rs # 串口操作 (列举/打开/读写)
│ └── state.rs # 应用状态管理
├── tests/
│ ├── astm_e2e.rs # Rust 端到端集成测试
│ ├── instrument_simulator.py # Python 仪器模拟器
│ └── test_integration.ps1 # PowerShell 集成测试脚本
└── docs/
└── TEST_PLAN.md # 测试计划文档
- lib 层 (
astm,serial,state): 纯协议和状态逻辑,不依赖 Slint - bin 层 (
app): UI 回调绑定,依赖 Slint 和 lib 层 - 集成测试通过
lis_simulatorcrate 访问 lib 层
- 帧格式(R3M):
STX + 数据 + ETX + checksum(hex) + CR + LF(无帧号字节) - 帧格式(标准):
STX + 帧号 + 数据 + ETX + checksum(hex) + CR + LF - 校验和: 所有字节模256,转hex字符串(通过
protocol.json配置) - 握手: ENQ → ACK → 数据帧 → ACK → EOT
- 自动应答: 收到 ENQ 自动回 ACK,收到数据帧校验通过后自动回 ACK
通过 settings/protocol.json 适配不同仪器的帧格式差异:
| 配置项 | 说明 | R3M 默认值 |
|---|---|---|
has_frame_number |
STX 后是否有帧号字节 | false |
checksum_includes_stx |
校验和计算是否包含 STX | true |
checksum_zero_padded |
校验和 hex 是否补零(2位) | false |
- 串口读取使用独立线程 + mpsc channel,避免阻塞 UI
- UI 更新使用 Timer 50ms 轮询,避免 Slint 线程安全问题
- 帧缓冲区支持跨多次读取拼接,处理分包情况
- 配置文件使用 JSON 格式,便于后期扩展协议字段映射
# 单元测试 + 集成测试
cargo test
# 仅单元测试
cargo test --lib
# 仅集成测试
cargo test --test astm_e2e
# TCP 集成测试 (无需物理串口)
cargo run -- --headless --tcp 12345
python tests/test_tcp.py --port 12345
# 串口集成测试 (需要 com0com 虚拟串口)
python tests/instrument_simulator.py --port COM11 --baud 9600
powershell -File tests/test_integration.ps1cargo build --release产物: target/release/lis-simulator.exe
当修改 ASTM 协议实现时,确保:
-
astm/control.rs中的单元测试通过 -
astm/frame.rs中的帧解析/构建测试通过 -
astm/record.rs中的记录解析测试通过 -
tests/astm_e2e.rs中的端到端测试通过 - 更新
docs/TEST_PLAN.md中的测试状态