基于 ASTM E1381/E1394 协议的实验室信息系统(LIS)模拟器,用于测试医疗检验仪器的串口通信功能。
跨平台支持:Windows / Linux
- 协议实现:完整支持 ASTM E1381 传输层与 E1394 数据内容标准
- 通信模式:支持单向(接收结果)与双向(查询/应答)两种 LIS 工作模式
- 数据解析:实时解析 H/P/O/R/L/Q/C 记录,结构化展示检验结果
- 传输方式:支持传统串口(RS232)和 TCP 网络通信
- 调试工具:原始数据日志、HEX 显示、UTF-8 解码、数据导出
| 组件 | 技术 |
|---|---|
| 语言 | Rust (Edition 2021) |
| UI 框架 | Slint (Fluent 风格) |
| 串口通信 | serialport 4.x |
| 集成测试 | Python 3 + pyserial |
- Rust 工具链(推荐通过 rustup 安装)
- Windows:MSVC Build Tools
- Linux:
build-essential、pkg-config、libfontconfig-dev
cargo build --releasecargo run --release- 启动程序,在配置面板选择串口号/波特率或 TCP 模式
- 选择单向或双向通信模式
- 点击 开始监听
- 仪器发送数据后,原始日志和解析结果实时显示
cargo test# 终端 1:启动无头 TCP 服务器
cargo run -- --headless --tcp 12345
# 终端 2:运行测试脚本
python tests/test_tcp.py --port 12345# 终端 1:启动 GUI
cargo run
# 终端 2:模拟仪器端
python tests/instrument_simulator.py --port COM11 --baud 9600仪器与 LIS 之间的通信建立过程:
完整流程:ENQ → ACK → 数据帧(可多帧) → ACK(每帧) → EOT
ASTM 数据帧由以下部分组成:
- STX (0x02):帧开始标志
- 帧号:0-9 循环,用于检测丢失/重复帧
- 数据区:一条或多条记录,以 CR 分隔
- ETX (0x03):帧结束标志(ETB 表示分帧)
- 校验和:从帧号到 ETX 所有字节之和 mod 256
- CR LF:帧终止符
| 记录类型 | 说明 |
|---|---|
H |
Header Record - 消息头 |
P |
Patient Record - 患者信息 |
O |
Order Record - 检验申请 |
R |
Result Record - 检验结果 |
Q |
Request Record - 查询请求(双向模式) |
C |
Comment Record - 备注 |
L |
Terminator Record - 结束标记 |
不同仪器的帧格式存在细微差异(帧号有无、校验和范围、hex 补零等),通过 protocol.json 适配:
{
"astm": {
"has_frame_number": false,
"checksum_includes_stx": true,
"checksum_zero_padded": false
}
}| 配置项 | 说明 | 默认值 |
|---|---|---|
has_frame_number |
STX 后是否有帧号字节 | false |
checksum_includes_stx |
校验和计算是否包含 STX | true |
checksum_zero_padded |
校验和 hex 是否补零(2位) | false |
配置文件路径:settings/protocol.json 或项目根目录 protocol.json
根据实际仪器的协议文档调整配置,抓包对比即可确认。
Copyright (C) 2026 Mq-b
本项目基于 GPL-3.0 许可证开源。

