ESCOM 是一款使用 Rust 和 eframe/egui 编写的 Windows 串口查看器,面向嵌入式开发、设备联调和持续日志观察场景。串口读写在独立线程中执行,避免阻塞界面;接收数据采用有界缓存,并针对持续数据流进行了增量格式化和搜索优化。
当前版本:
0.2.4。项目处于早期开发阶段,欢迎提交 Issue 和 Pull Request。
- 自动枚举可用串口,并支持手动刷新。
- 支持
1至4,000,000的自定义波特率。 - 支持数据位、停止位、奇偶校验和软件/硬件流控。
- 支持 DTR、RTS 控制。
- 文本、HEX 和终端三种接收模式。
- HEX 模式按连续字节流每 16 字节分行,不受底层串口读取分片影响。
- 文本模式支持 UTF-8、GBK 编码。
- 支持可配置格式的时间戳、暂停显示、自动滚动和收发字节计数。
- 提供 5、20、100、500 MiB 可选原始数据缓存;显示窗口最多保留最近 100,000 行或 16 MiB 文本,避免大缓存被完整物化为 UI 对象。
- 支持普通文本或正则表达式搜索、大小写匹配、结果导航和过滤显示。
- 支持通过 TOML 配置整行高亮规则。
- 可按当前显示模式导出带 UTF-8 BOM 的 TXT 文件;文本和 HEX 模式会流式写出完整接收缓存。
- Terminal 模式导出解析后的终端屏幕文本,不包含 ANSI/CSI 控制序列。
- 支持文本和 HEX 发送。
- 文本发送支持无行尾、CR、LF 和 CRLF。
- 保存最近 50 条成功发送记录,并自动去重。
- 支持可调间隔的循环发送,间隔范围为 20 ms 至 1 小时。
- 终端模式支持 ANSI/VT100 清行、清屏和光标控制;可直接在接收区输入,使用方向键浏览历史和移动光标,并正确处理退格、Home、End、Delete 等按键。
- 支持跟随系统、亮色和暗色主题。
- 可分别设置界面字体和串口数据字体,包括字号、字重和数据行距。
- 支持本地图片或 HTTP(S) 在线图片作为应用背景。
- 可分别调整亮色、暗色主题下的背景不透明度。
- 可从背景图片自动提取强调色,并动态调整按钮、选项和搜索高亮颜色。
- 自绘标题栏与应用主题保持一致,支持窗口拖动、缩放、双击最大化和窗口快捷菜单。
从仓库的 Releases 页面下载最新的 escom.exe,双击即可运行,无需安装 Rust。
ESCOM 不会自动连接设备。启动后请选择串口和通信参数,再点击“打开串口”。如果列表中没有目标设备,请确认串口驱动已安装、设备未被其他程序占用,然后点击刷新按钮重新扫描。
构建环境:
- Windows
- Rust
1.96或更新版本 - 包含
rc.exe的 Windows SDK
克隆或下载本仓库并进入项目目录后运行:
cargo test --all-targets
cargo clippy --all-targets -- -D warnings
cargo build --release构建完成后,可执行文件位于:
target\release\escom.exe
开发时也可以直接运行:
cargo run- 连接串口设备并启动 ESCOM。
- 从顶部工具栏选择串口、波特率和其他通信参数。
- 点击“打开串口”开始接收数据。
- 根据设备输出选择文本、HEX 或终端模式;文本乱码时可切换 UTF-8 与 GBK。
- 在底部发送区输入文本或 HEX 数据并发送,需要持续发包时启用“循环发送”。
- 使用接收区工具栏完成搜索、过滤、清空或导出。
HEX 发送支持带空格或连续输入,例如以下两种写法等价:
AA 01 FF
AA01FF
首次启动时,ESCOM 会自动创建高亮配置:
%APPDATA%\ESCOM\highlight.toml
规则按照文件中的书写顺序匹配,第一条命中的规则决定整行样式。修改文件后,在接收区的“高亮”菜单中点击“重新加载”。
version = 1
[[rules]]
name = "错误"
enabled = true
mode = "regex" # contains 或 regex
pattern = '\b(ERROR|FATAL)\b|错误'
case_sensitive = false
foreground = "#FF6B6B"
background = "#E5484D40" # #RRGGBB 或 #RRGGBBAA
underline = false每条启用的规则至少需要设置 foreground、background 或 underline 之一。
ESCOM 的本地文件保存在 %APPDATA%\ESCOM\:
| 文件 | 用途 |
|---|---|
settings.toml |
界面、字体、收发显示和背景偏好 |
highlight.toml |
接收内容高亮规则 |
window.ron |
窗口位置与尺寸 |
logs\escom.log |
应用生命周期、串口错误和后台任务耗时诊断日志 |
settings.toml 按功能分组,首次启动时会自动创建。建议关闭 ESCOM 后再手动修改,重新启动后生效:
schema_version = 6
[interface]
theme = "system" # system、light 或 dark
[fonts]
ui_family = "" # 留空表示自动选择
data_family = ""
ui_weight = 400 # 1-1000
data_weight = 400
ui_size = 15.0 # 10-18
data_size = 15.0 # 10-48
data_line_spacing = 3.0 # 0-24
[receive]
mode = "text" # text、hex 或 terminal
encoding = "utf8" # utf8 或 gbk
timestamps = false
timestamp_format = "%Y-%m-%d %H:%M:%S%.3f" # chrono/strftime 格式
auto_scroll = true
buffer_limit_mib = 20 # 5、20、100 或 500
[send]
mode = "text" # text 或 hex
line_ending = "crlf" # none、cr、lf 或 crlf
clear_after_send = false # 成功加入发送队列后清空输入框
repeat_interval_ms = 1000 # 20-3600000
[background]
source = "none" # none、local 或 online
local_path = ""
online_url = ""
light_opacity = 0.22 # 0.0-1.0
dark_opacity = 0.16 # 0.0-1.0
dynamic_accent = true # 根据背景图片自动生成按钮与选项的强调色配置中的字段可以省略,缺失字段会使用默认值。字段名、枚举值或 schema_version 无效时,应用启动后会显示错误提示,并在本次运行中停止自动保存设置,以免退出时覆盖原配置;修复或移走无效文件并重启后即可恢复保存。旧版 settings.json 会在首次启动新版时自动迁移,成功后归档为 settings.json.migrated.bak。
- 应用不会持久化串口参数、发送内容、发送历史或接收数据。
- 应用启动时不会自动连接串口。
- 本地背景仅记录原始文件路径;在线背景仅记录图片地址。
- 使用在线背景时,应用需要访问对应的 HTTP(S) 图片地址。
- 诊断日志不会记录串口收发正文;单个日志文件最多 2 MiB,并保留 3 份滚动归档。
默认基准覆盖 20 MiB 全量显示重建与流式导出、128 KiB 增量格式化,以及 10 万行普通/正则搜索:
cargo bench --bench pipeline需要同时测量 100 MiB 和 500 MiB 缓存时,显式启用大数据集:
$env:ESCOM_BENCH_LARGE = "1"
cargo bench --bench pipeline
Remove-Item Env:ESCOM_BENCH_LARGEsrc/
├── app.rs # 应用状态、后台事件与生命周期
├── app/ # 连接、接收、搜索、任务状态机、发送和设置界面
├── logging.rs # 滚动诊断日志
├── serial_worker.rs # 串口后台任务
├── store.rs # 有界接收缓存
├── formatting.rs # 文本/HEX 格式化与导出
├── search.rs # 搜索与增量索引
├── highlight.rs # TOML 高亮规则
├── settings.rs # 用户偏好与配置存储
├── fonts.rs # 系统字体加载
└── window_chrome.rs # 自绘标题栏与窗口交互
benches/
└── pipeline.rs # 格式化、搜索和导出性能基准
当前版本暂不包含:
- 协议解析和数据绘图
- 自动保存串口接收内容
- 多命令预设
- 插件系统
- 串口断线自动重连
- 应用内在线更新
接收区只显示设备返回的数据;已发送内容通过发送历史和 TX 计数查看。
提交问题前,请尽量附上 Windows 版本、串口设备或芯片型号、通信参数、复现步骤以及相关日志。代码贡献建议先创建 Issue 说明需求或问题,再提交范围清晰的 Pull Request。
提交前请运行:
cargo fmt --check
cargo test --all-targets
cargo clippy --all-targets -- -D warnings本项目基于 MIT License 开源。