# TuiSerial - 终端串口调试助手

一个用 Rust + Ratatui 构建的现代化 TUI 串口调试工具，支持完整的键盘和鼠标交互。

![](image/image.png)

## 📦 安装

### 从 crates.io 安装

```bash
cargo install tuiserial
```
运行
```bash
tuiserial
```

### 从源码构建

1. 克隆仓库：`git clone https://github.com/yourusername/tuiserial.git`
2. 进入目录：`cd tuiserial`
3. 构建：`cargo build --release`
4. 运行：`cargo run --release`

### 使用预编译二进制文件

1. 下载二进制文件：[下载链接](https://github.com/yourusername/tuiserial/releases)
2. 解压文件
3. 运行：`./tuiserial`

## ✨ 功能特性

### 核心功能
- **完整串口配置**：端口选择、波特率、数据位、校验位、停止位、流控制
- **配置持久化**：自动保存/加载配置到 `~/.config/tuiserial/config.json` 💾
- **配置锁定机制**：连接后自动锁定配置，防止误操作，断开后解锁 🔒
- **智能状态显示**：实时显示连接状态和完整配置信息（8-N-1 格式）
- **国际化支持**：支持中英文切换，默认英文 🌍
- **菜单栏导航**：标准菜单栏（文件/设置/帮助），支持键盘和鼠标操作
- **双模式显示**：HEX 和 TEXT 两种显示模式，实时切换
- **简洁消息格式**：`[时间] ◄ RX (字节数) 数据` - 清晰直观
- **双向数据传输**：支持 HEX/ASCII 两种发送模式
- **灵活追加选项**：可选择追加 `\n`、`\r`、`\r\n`、`\n\r` 或无追加
- **实时数据接收**：高效的环形缓冲区，支持最多 10000 行日志
- **自动/手动滚动**：智能自动跟踪或手动浏览历史数据
- **快捷操作**：快速切换配置和显示模式

### 交互特性
- **完整键盘控制**：vim 风格快捷键 + 标准导航键 + F10 菜单
- **全面鼠标支持**：点击、右键、中键、滚轮全支持，菜单栏点击
- **实时统计**：Tx/Rx 字节数统计和连接状态
- **通知系统**：操作反馈和错误提示，支持多语言

### UI 优化
- **状态面板重构**：
  - 连接状态：`✓ 已连接` / `✗ 未连接`
  - 配置状态：`🔓 可修改` / `🔒 已锁定`
  - 完整配置信息：串口、波特率、配置格式（8-N-1）
- **消息日志优化**：
  - 简洁标题：`消息 - HEX | 123 条 [x 切换 | c 清空]`
  - 统一格式：`[时间] ◄ RX (字节数) 数据`
  - 智能提示：空日志时显示连接状态和快捷键
- **配置锁定提示**：连接后配置面板显示 `[已锁定]` 标记，边框变灰
- **追加选项选择器**：右侧独立面板快速选择换行符类型
- **高亮提示**：焦点字段黄色高亮，选中项加粗显示，锁定字段灰色显示

## 📦 项目结构

采用 Cargo Workspace 管理的模块化架构：

```
tuiserial/
├── Cargo.toml                 # Workspace 配置
├── crates/
│   ├── tuiserial-core/        # 核心数据模型和状态管理
│   ├── tuiserial-serial/      # 串口通信库（封装 serialport）
│   ├── tuiserial-ui/          # UI 渲染组件（基于 ratatui）
│   └── tuiserial-cli/         # 命令行主程序和事件处理
├── ARCHITECTURE.md            # 详细架构文档
├── LOGIC_VALIDATION.md        # 逻辑验证和测试清单
├── QUICK_REFERENCE.md         # 快速参考指南
└── README.md                  # 本文档
```

## 🚀 快速开始

### 编译

```bash
cd tuiserial
cargo build --release
```

### 运行

```bash
./target/release/tuiserial
```

或直接运行：

```bash
cargo run --release --bin tuiserial
```

## ⌨️ 键盘快捷键

### 全局控制
| 快捷键 | 功能 |
|--------|------|
| `F10` | 打开/关闭菜单栏 |
| `q` / `Esc` | 退出程序（或关闭菜单） |
| `Tab` | 切换焦点到下一个字段 |
| `Shift+Tab` | 切换焦点到上一个字段 |
| `o` | 打开/关闭串口连接（连接后锁定配置） |
| `r` | 刷新串口列表 |

### 菜单栏导航（F10 激活）
| 快捷键 | 功能 |
|--------|------|
| `←` / `→` | 切换菜单项 |
| `↑` / `↓` | 在下拉菜单中选择 |
| `Enter` | 执行选中的菜单项 |
| `Esc` | 关闭菜单/返回上级 |

### 配置面板导航（⚠️ 连接后自动锁定）
| 快捷键 | 功能 |
|--------|------|
| `↑` / `k` | 列表向上/减小值 |
| `↓` / `j` | 列表向下/增大值 |
| `←` / `h` | 减小波特率 |
| `→` / `l` | 增大波特率 |
| `p` | 切换校验位（None → Even → Odd） |
| `f` | 切换流控制（None → Hardware → Software） |

**注意**：连接串口后，所有配置参数自动锁定，无法修改。必须先断开连接才能调整配置。

### 日志区域
| 快捷键 | 功能 |
|--------|------|
| `x` | 切换 HEX/TEXT 显示模式 |
| `c` | 清空日志 |
| `a` | 切换自动滚动 |
| `PgUp` | 向上翻页（10行） |
| `PgDn` | 向下翻页（10行） |
| `Home` | 跳到日志开头 |
| `End` | 跳到日志末尾（并开启自动滚动） |

### 发送区域（焦点在发送框时）
| 快捷键 | 功能 |
|--------|------|
| `字符键` | 输入字符 |
| `Backspace` | 删除前一个字符 |
| `Delete` | 删除后一个字符 |
| `←` / `→` | 移动光标 |
| `Home` / `End` | 光标移到开头/结尾 |
| `↑` / `↓` | 切换 HEX/ASCII 模式 |
| `n` | 循环切换追加选项 |
| `Enter` | 发送数据 |
| `Esc` | 清空输入 |

## 🖱️ 鼠标交互

### 左键点击
- **菜单栏** → 打开菜单下拉列表
- **菜单项** → 执行对应功能
- **配置面板** → 切换焦点并直接选择列表项
- **日志区域** → 切换焦点到日志区域
- **发送框** → 切换焦点并定位光标位置
- **追加选项** → 直接选择追加模式

### 右键点击
- **日志区域** → 快速切换 HEX/TEXT 显示模式
- **发送框** → 快速切换 HEX/ASCII 发送模式
- **追加选项** → 循环切换追加模式
- **统计信息区** → 切换自动滚动开关

### 中键点击
- **日志区域** → 快速清空日志
- **发送框** → 快速清空输入

### 滚轮滚动
- **日志区域** → 向上/向下滚动日志（3行）
- **配置列表** → 在列表中向上/向下选择
- **追加选项** → 循环切换追加模式

## 📊 数据格式

### 接收显示格式
```
[14:32:45.123] ◄ RX (   5 B) 48 65 6C 6C 6F
[14:32:45.456] ◄ RX (   5 B) Hello
```

**格式说明**：
- 时间戳精确到毫秒
- `◄ RX` 接收方向（青色加粗）
- `► TX` 发送方向（绿色加粗）
- 字节数右对齐，便于查看

### 发送模式
1. **ASCII 模式**：直接输入文本，如 `Hello`
2. **HEX 模式**：输入十六进制，空格分隔，如 `48 65 6C 6C 6F`

### 追加选项
- **无追加**：不添加任何字符
- **\n**：添加换行符（LF，0x0A）
- **\r**：添加回车符（CR，0x0D）
- **\r\n**：添加回车换行（CRLF，0x0D 0x0A）
- **\n\r**：添加换行回车（LFCR，0x0A 0x0D）

## 🛠️ 技术栈

- **Ratatui 0.29**：现代的 Rust TUI 框架
- **Crossterm 0.28**：跨平台终端控制
- **Serialport 4.3+**：跨平台串口访问
- **Tokio 1.40**：异步运行时
- **Chrono 0.4**：时间戳处理
- **Color-eyre 0.6**：错误处理

## 📈 开发状态

### ✅ 已实现
- ✅ 串口配置管理（所有常用参数）
- ✅ **配置持久化**（自动保存/加载配置文件）
- ✅ **菜单栏系统**（文件/设置/帮助，支持键盘和鼠标）
- ✅ **国际化支持**（中英文切换，编译时零开销）
- ✅ **配置锁定机制**（连接后自动锁定，防止误操作）
- ✅ **智能状态显示**（连接状态、配置状态、完整配置信息）
- ✅ 数据接收显示（HEX/TEXT 模式）
- ✅ 数据发送功能（HEX/ASCII 模式）
- ✅ 追加选项（\n, \r, \r\n, \n\r, 无）
- ✅ 完整键盘控制（含 F10 菜单快捷键）
- ✅ 完整鼠标交互（点击、右键、中键、滚轮、菜单栏）
- ✅ **优化消息格式**（简洁直观的日志显示）
- ✅ 自动/手动滚动
- ✅ 实时统计和通知系统
- ✅ 完整逻辑验证（见 LOGIC_VALIDATION.md）
- ✅ 模块化架构（Workspace）

### 🔄 计划中
- 🔄 命令预设和快速发送
- 🔄 日志导出（TXT/CSV/JSON）
- 🔄 搜索和过滤功能
- 🔄 数据分析和图表
- 🔄 协议解析器插件
- 🔄 更多语言支持（日语、韩语等）
- 🔄 多串口同时监控
- 🔄 宏录制和回放

## 📚 文档

- [ARCHITECTURE.md](ARCHITECTURE.md) - 详细架构设计文档
- [LOGIC_VALIDATION.md](LOGIC_VALIDATION.md) - 逻辑验证和测试清单
- [QUICK_REFERENCE.md](QUICK_REFERENCE.md) - 快速参考指南
- [Cargo Workspace](https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html) - Cargo Workspace 官方文档

## 🔐 核心特性：配置锁定机制

**为什么需要配置锁定？**
在串口通信中，连接建立后修改参数可能导致：
- 通信中断或数据损坏
- 设备响应异常
- 调试信息混乱

**我们的解决方案：**
1. ✅ **连接时自动锁定** - 按 `o` 连接后，所有配置参数立即锁定
2. ✅ **视觉反馈** - 配置面板显示 `[已锁定]` 标记，边框变灰
3. ✅ **操作拦截** - 任何修改尝试都会显示警告："配置已锁定，请先断开连接"
4. ✅ **断开解锁** - 再次按 `o` 断开后，配置恢复可修改状态
5. ✅ **状态同步** - 状态面板实时显示当前配置和锁定状态

**实际效果：**
```
未连接时：
  状态：✗ 未连接
  配置：🔓 可修改
  → 可以自由调整所有参数

连接后：
  状态：✓ 已连接
  配置：🔒 已锁定
  串口：/dev/ttyUSB0
  波特：115200
  配置：8-N-1
  → 参数锁定，无法修改

断开后：
  状态：✗ 未连接
  配置：🔓 可修改
  → 恢复可修改状态
```

## 🤝 贡献指南

欢迎提交 Issue 和 Pull Request！

1. Fork 本项目
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request

## 📝 许可证

MIT License

## 👨‍💻 作者

Your Name <your.email@example.com>

## 🌍 国际化

目前支持：
- **English** (默认)
- **中文**

切换语言：
- 按 `F10` 打开菜单
- 选择 `Settings` → `Toggle Language`
- 或直接点击菜单栏

技术实现：
- 使用 `phf` 实现编译时静态 HashMap
- 零运行时开销，所有翻译在编译时嵌入
- Fallback 机制：找不到翻译时返回 key 本身
- 简单直接，无复杂框架依赖

## 💾 配置文件

配置自动保存到：
- **Linux/macOS**: `~/.config/tuiserial/config.json`
- **Windows**: `%APPDATA%\tuiserial\config.json`

配置内容：
```json
{
  "port": "/dev/ttyUSB0",
  "baud_rate": 115200,
  "data_bits": 8,
  "parity": "None",
  "stop_bits": 1,
  "flow_control": "None"
}
```

操作：
- **保存配置**：菜单 → File → Save Config
- **加载配置**：菜单 → File → Load Config（启动时自动加载）
- 配置文件损坏时自动使用默认配置，不会崩溃

---

**⭐ 如果这个项目对你有帮助，请给一个 Star！**
