# RTT_TOOL **Repository Path**: baicai_code/rtt_-tool ## Basic Information - **Project Name**: RTT_TOOL - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-01 - **Last Updated**: 2026-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BK RTT Viewer 基于 PySide6 + pyqtgraph 的多通道实时数据可视化工具,通过 **SEGGER J-Link RTT** 读取 MCU 上的 RTT 控制块数据。 ## 功能 - **J-Link RTT 连接** — 通过 SWD/JTAG 连接 J-Link → 目标 MCU,自动搜索 `_SEGGER_RTT` 控制块 - **16 通道实时曲线** — pyqtgraph 高性能绘图,30fps 自动滚动 - **文本行解析** — MCU 用 `SEGGER_RTT_printf` 发送文本,上位机按 TAG 自动分发到对应控件 - **串口备选** — 同样支持通过串口接收数据 - **CSV 录制/导出** — 一键录制数据或导出缓冲区 - **配置持久化** — `config.json` 保存 J-Link 连接参数 ## 快速开始 ```bash pip install -r requirements.txt python main.py ``` ## MCU 数据格式 MCU 通过 RTT Channel 0 发送 **文本行**(`\n` 结尾),上位机根据前缀 TAG 解析: ### 1. 批量通道数据 `$PLT` (推荐) ``` $PLT,,,,...\n ``` 按序填入 CH0, CH1, CH2 ... 最多 16 通道。 ```c // MCU 侧示例 SEGGER_RTT_printf(0, "$PLT,%d,%d,%d\n", adc0, adc1, adc2); ``` ### 2. 单通道数据 `$CH` ``` $CH,<通道号>,<值>\n ``` 指定单个通道索引 (0-15)。 ```c SEGGER_RTT_printf(0, "$CH,5,%d\n", temperature); ``` ### 3. 日志消息 `$LOG` ``` $LOG,<消息文本>\n ``` 显示到底部日志面板。 ```c SEGGER_RTT_printf(0, "$LOG,System started, %d channels\n", ch_count); ``` ### 4. 无前缀文本 没有 `$` 前缀的行自动当作日志处理。 ```c SEGGER_RTT_printf(0, "Boot OK\n"); ``` ### MCU 完整示例 (任意 MCU + SEGGER RTT) ```c #include "SEGGER_RTT.h" void send_data(void) { int adc0 = read_adc(0); int adc1 = read_adc(1); int adc2 = read_adc(2); // 批量发送 3 个通道 SEGGER_RTT_printf(0, "$PLT,%d,%d,%d\n", adc0, adc1, adc2); } void send_single(void) { int temp = read_temperature(); SEGGER_RTT_printf(0, "$CH,0,%d\n", temp); } void send_log(void) { SEGGER_RTT_printf(0, "$LOG,Sampling at 100Hz\n"); } ``` ## J-Link RTT 配置 (config.json) ```json { "jlink_rtt": { "device": "STM32F407VG", "speed_khz": 4000, "interface": "SWD", "rtt_channel_up": 0, "rtt_channel_down": 0, "rtt_search_range": ["0x20000000", "0x10000"] } } ``` | 字段 | 说明 | |------|------| | `device` | 目标芯片型号 (J-Link 设备名称) | | `speed_khz` | SWD/JTAG 时钟速率 | | `interface` | `SWD` 或 `JTAG` | | `rtt_channel_up` | RTT 上行通道号 (MCU→PC,默认 0) | | `rtt_channel_down` | RTT 下行通道号 (PC→MCU,默认 0) | | `rtt_search_range` | RTT 控制块搜索范围 [起始地址, 大小] | > **注意**: `rtt_search_range` 应覆盖 MCU 的 RAM 区域。不同芯片 RAM 起始地址不同: > - STM32F4: `0x20000000` > - STM32H7: `0x24000000` (AXI SRAM) > - GD32: `0x20000000` > - ESP32: 不支持 J-Link RTT ## 项目结构 ``` ├── main.py # 入口 ├── config.json # J-Link / 连接配置 ├── app/ │ ├── core/ # 应用基础 (配置、主题、日志) │ ├── models/ # 数据模型 (协议解析、通道缓冲区) │ ├── services/ # 数据源 (J-Link RTT、串口、模拟器) │ ├── controllers/ # 业务控制器 │ └── ui/ # PySide6 界面 │ └── widgets/ # 独立控件 └── tests/ # 单元测试 ``` ## 依赖 - Python 3.10+ - PySide6 - pyqtgraph - pyserial - numpy - **pylink-square** (J-Link RTT 连接必需)