基于 Tauri 2 + Dioxus 0.7 的跨平台串口调试工具,使用 Rust 全栈开发。
- 串口枚举、打开 / 关闭、状态监测
- 多编码收发:ASCII、HEX、UTF-8、GBK
- 实时接收显示,时间戳 + 原始字节
- 命令管理:保存常用指令、单次发送、循环发送
- 数据导出:TXT、CSV
- macOS / Windows / Linux 原生窗口毛玻璃效果(Vibrancy / Mica / Acrylic / Blur)
- 自定义无边框窗口与主题
| 层 | 技术 |
|---|---|
| 桌面外壳 | Tauri 2 |
| 前端 UI | Dioxus 0.7(WebView 渲染) |
| 串口驱动 | serialport 4.x |
| 编码转换 | encoding_rs(GBK 支持) |
| 窗口效果 | window-vibrancy |
.
├── src/ # 前端 (Dioxus, 编译为 wasm)
│ ├── app.rs # 根组件
│ ├── components/ # UI 组件
│ │ ├── serial_panel.rs # 串口配置面板
│ │ ├── receive_send_tab.rs # 接收 / 发送 Tab
│ │ ├── command_manager_tab.rs# 命令管理 Tab
│ │ ├── tab_nav.rs / title_bar.rs / status_bar.rs
│ ├── services/
│ │ ├── api.rs # Tauri invoke 封装
│ │ └── store.rs # 全局状态
│ └── assets/main.css
├── src-tauri/ # 后端 (Tauri / Rust)
│ ├── src/
│ │ ├── main.rs / lib.rs
│ │ ├── serial/
│ │ │ ├── manager.rs # 串口管理 (跨平台)
│ │ │ ├── commands.rs # Tauri 命令
│ │ │ └── encoding.rs # 编码转换
│ │ └── export/exporter.rs # 日志导出
│ ├── Cargo.toml
│ └── tauri.conf.json
└── Cargo.toml # workspace 根
- Rust stable (edition 2021)
- Tauri CLI:
cargo install tauri-cli --version "^2.0" - Dioxus CLI:
cargo install dioxus-cli --version "^0.7" - 各平台原生依赖:
- macOS:Xcode Command Line Tools
- Windows:Microsoft Edge WebView2(Win10 1809+ 自带)+ MSVC 工具链
- Linux:
libwebkit2gtk-4.1-dev、libgtk-3-dev、libayatana-appindicator3-dev、librsvg2-dev、libssl-dev、pkg-config
# 启动开发服务器(自动热重载)
cargo tauri devcargo tauri dev 会先通过 dx serve 启动 Dioxus 前端(http://localhost:8080),再启动 Tauri 主进程。
cargo tauri build产物输出位置:
- macOS:
src-tauri/target/release/bundle/{dmg,macos}/ - Windows:
src-tauri/target/release/bundle/{msi,nsis}/ - Linux:
src-tauri/target/release/bundle/{deb,rpm,appimage}/
cd src-tauri
cargo test后端覆盖了串口管理器关闭流程和编码模块(ASCII / HEX / UTF-8 / GBK)。
串口底层使用 cfg 切换原生类型:
| 平台 | 原生句柄 | 备注 |
|---|---|---|
| macOS | serialport::TTYPort |
接收线程额外设置 O_NONBLOCK,规避部分驱动 poll() 假阳性导致 read() 永久阻塞 |
| Linux | serialport::TTYPort |
默认阻塞 + 100ms 超时 |
| Windows | serialport::COMPort |
默认阻塞 + 100ms 超时 |
macOS 专属逻辑严格隔离在 #[cfg(target_os = "macos")] 块内,不影响其他平台。
如果遇到串口连接后无响应、断开卡死等问题,参考 commit 历史:
fix: 串口连接卡死—O_NONBLOCK+WouldBlock兜底fix: 保存指令卡死— 配置写盘流程
待定。