A serial monitor that keeps up with your board. Монитор порта, который не отстаёт от платы.
Multi-port terminal, live plotter and ESP32 backtrace decoding — inside VS Code, wired into PlatformIO. Мультипортовый терминал, живой график и декодирование backtrace ESP32 — внутри VS Code, в связке с PlatformIO.
English
- Why
- Features
- Requirements
- Quick start
- Commands
- Interface
- Multiple ports at once
- Plotter
- ESP32 debugging
- PlatformIO integration
- Themes
- Known limitations
- Troubleshooting
- Also available without VS Code
- Roadmap
- License
Why
Most serial monitors hand you a text stream and stop there. That is fine until the board reboots in the middle of a log, panics with a raw Backtrace: 0x400d1a2b:0x3ffb1f30, or you need two boards side by side on one timeline.
This extension is built for that part of the job:
- it owns the port itself — so board reset,
setup()output and multiple ports on a shared clock all work, instead of being lost to a wrapped CLI monitor; - it reads your
platformio.ini— port and baud rate come from the project, and the port is handed back automatically while you flash; - it decodes ESP32 backtraces into
function → file:linefrom the ELF your build already produced.
Features
- 📟 Terminal — RX/TX over UART with millisecond timestamps, autoscroll and colour-coded RX / TX / system lines
- 🪟 Its own window — the monitor opens as a separate editor window, so the log lives next to the code instead of eating half of it
- 🔌 Multiple ports at once — two or more boards in one panel, every line and every plot series tagged with a coloured port label (
P1,P2, …), on one shared timeline - 🏷️ Stable board numbers — a board keeps its
Plabel across reconnects, even when the OS hands it a different port path - 🔎 Live filter — hides non-matching lines as they arrive, and the ones already on screen
- 📈 Live plotter (Chart.js) — plots numbers found in incoming lines, several series per port and several ports on one chart
- 🖼️ Chart export — PNG snapshot and CSV of the raw points for Excel or pandas
- 💾 Real-time file logging — every line is appended to a file as it arrives, not only when you press save
- 📊 Debug statistics — per-port idle time and round-trip time, plus counters for errors, crashes and reboots
- 🧩 Backtrace decoding —
Backtrace:lines are resolved tofunction → file:lineby a bundled DWARF parser, no external toolchain call - 🔄 Board reset per port — DTR/RTS pulse from the port chip, and the control lines are left deasserted so a physical RESET runs your firmware instead of dropping into the bootloader
- ⚙️ PlatformIO integration — port and speed from
platformio.ini, automatic release and reconnect around upload tasks - 🎨 Six themes — VS Code Dark/Light, Monokai, Dracula, Solarized Dark, Hacker (Matrix), remembered between sessions
- 📄 Export and copy — terminal to
.txt, or the whole log to the clipboard - ⚡ Native port access — the port is opened by the
serialportmodule in the extension host, not by a wrapped CLI
Requirements
| Requirement | Notes |
|---|---|
| VS Code | 1.84 or newer. |
platformio.ini in the folder |
Only for the project integration — port, baud rate and upload synchronisation. The monitor itself opens in any folder. |
| PlatformIO IDE | Not required. It is only needed for the build tasks the monitor synchronises with. |
| Device driver | The usual one for your board (CP210x, CH340, FTDI and friends), installed in the OS. |
| Native module | serialport ships with the extension, built through N-API so it works across Electron versions. See Troubleshooting if a port refuses to open. |
Quick start
- Click ⏻ SUS Monitor in the status bar, at the bottom right of the window. The monitor opens in its own window, without touching any port — put it on a second screen next to the code and it stays there.
- In a PlatformIO folder there is a shortcut: put the cursor in any editor and press Ctrl+K M (Cmd+K M on macOS) — the monitor opens and connects to the board in one step. It is a chord: hold Ctrl, press K, release, press M.
- Otherwise press + Добавить порт in the toolbar and pick the board from the list.
- Type a command in the field at the bottom and press Enter. The line ending is selectable,
\r\nby default. - Numbers in incoming lines show up on the Плоттер tab automatically.
Nothing arriving? Run SUS Monitor: показать журнал. Port errors and symbol-loading problems are written there and to the terminal, so that is where the reason lives — port did not open, firmware.elf not found, upload task not recognised.
Commands
Available from the Command Palette (Ctrl+Shift+P); typing SUS brings up all three. The titles are currently in Russian — see Known limitations.
| In the palette | What it does |
|---|---|
SUS Monitor: открыть монитор |
Opens the panel without touching any port |
SUS Monitor: открыть и подключиться к плате |
Opens and connects using platformio.ini (Ctrl+K M, editor focus required) |
SUS Monitor: показать журнал |
Opens the SUS Monitor diagnostic channel in the Output panel |
The first one also sits on the ⏻ SUS Monitor button in the status bar, and in the editor title bar while platformio.ini is the active file.
Interface
Toolbar
| Element | Purpose |
|---|---|
| + Добавить порт | Picks a port from a QuickPick list — boards first — and connects it as a new session |
| Baud rate | Speed for the next port you connect; already-open ports keep theirs |
| Тема | Theme selector |
| Port chips | One per connected port: colour tag, speed, reset (↺) and disconnect (✕) |
| 🧩 .elf/.map | Loads a symbol file for backtrace decoding by hand; .elf gives file and line, .map only names |
| 🔴 Запись в файл | Starts and stops real-time logging to a file |
| Монитор / Плоттер | Tab switch |
| Автоскролл / Время | Terminal behaviour toggles |
| Filter field | Hides log lines that do not contain the substring |
| Точек | How many recent points the plotter keeps, 50 by default |
| 🖼️ PNG / 📄 CSV | Chart export, shown on the plotter tab |
| RX counter | Live traffic across all ports: bytes, lines, bytes per second |
| 📊 Статистика | Opens the debug statistics panel |
| Очистить | Clears terminal, chart and counters; ports stay connected |
| Копировать | Copies the whole terminal log to the clipboard |
| Сохранить лог | Exports the log to a .txt file once |
Input bar
Target port for the command, line ending (none, \n, \r, \r\n — default), the command field itself and Отправить.
Multiple ports at once
Each + Добавить порт creates an independent connection, as many as the OS will grant.
- Every port keeps the baud rate that was selected when it was connected.
- Terminal and plotter are shared, but each line and series carries the colour and tag of its port — two devices line up on one timestamp scale.
- Отправить в picks which port the next command goes to.
- Reset (↺) and disconnect (✕) act on one port, from its own chip.
- Idle time and RTT are measured per port, so a single hung device is visible instead of a silent panel.
- Error, crash and reboot counters are shared across all ports (see Known limitations).
How a board keeps its number
Unplug a board and plug it back in and the OS may hand it a different path — COM5 becomes COM7, /dev/ttyUSB0 becomes /dev/ttyUSB1. The number in the port chip follows the device, not the path, so P1 stays P1 instead of counting up on every reconnect and splitting the plot into new series.
Identification, strongest first:
| Source | When it works |
|---|---|
| USB serial number | CP210x, FTDI, native USB on the ESP32-S2/S3/C3 — available the moment the port opens |
| USB VID/PID | Any adapter, but it only identifies the model. Two identical CH340 clones share one key |
| MAC address from the boot log | Any ESP that prints its MAC on startup. The most reliable of the three, but it arrives a second or two after the port opens |
When the MAC arrives and says the board belongs to a number that is currently free, the connection moves there and the terminal says so. Once a chart series has been drawn for a port, its number is left alone — renumbering would orphan the series. The MAC is remembered either way, so the next connect is identified immediately.
Hover a port chip to see the MAC the number is bound to.
Plotter
- Numbers are parsed out of every line, separated by whitespace or commas.
- Each position in the line becomes its own series per port (
P1 · S1,P1 · S2,P2 · S1, …), coloured from the current theme's palette. - A missing value leaves a gap rather than a drop to zero.
- History depth is the Точек field, 50 by default.
- PNG saves the current canvas; CSV exports every point of every series with its timestamp.
ESP32 debugging
Errors, reboots and crashes are classified and counted as they arrive.
| Counter | What matches |
|---|---|
| Ошибок в логе | error, ошибка, exception, fail, failed, panic, паника |
| Крашей (Backtrace) | a Backtrace: line, Guru Meditation, fatal exception, abort() was called, assert failed |
| Обнаружено перезагрузок | ESP32/Arduino boot markers: rst:0x, ets Jun, ets Jul, rebooting, reset reason, boot:0x13, power on reset |
When a Backtrace: line appears, its addresses are decoded in place under the line:
Backtrace:0x400d1fb9:0x3ffb21a0 0x400d2c85:0x3ffb21c0
[DECODE] 0x400d1fb9 → loop() at main.cpp:142
Symbols are picked up on their own — the newest firmware.elf in .pio/build is loaded when the panel opens, so there is nothing to point at by hand. The 🧩 .elf/.map button is there for the cases where you want a different build.
Decoding is done by a bundled DWARF parser that reads DWARF 2–4. Current ESP-IDF versions emit DWARF 5; on those builds a backtrace degrades to symbol +0xoffset from the ELF symbol table instead of an exact line. Routing this through the toolchain's own addr2line is the first item on the roadmap.
PlatformIO integration
monitor_portandmonitor_speedare read fromplatformio.ini, honouring[env]inheritance anddefault_envs.- With no
monitor_portset, the first port that looks like a board wins — matched on the USB VID of the usual suspects (CP210x10c4, CH3401a86, FTDI0403, Arduino2341, Espressif303a, Adafruit239a) and on the device name. If nothing looks like a board, the first available port is used. - When a PlatformIO upload task starts, the port is released so the bootloader can take it.
- When the task ends, the monitor reconnects with retries, because a board does not come back to the OS instantly. If the upload failed, the port stays closed.
- Opening a port leaves DTR and RTS deasserted. Both lines at the same level leave the auto-reset circuit alone, so pressing RESET on the board runs your firmware. With DTR asserted and RTS clear — what the Windows driver defaults to — the same press lands in
rst:0x1 (POWERON),boot:0x2 (DOWNLOAD(USB/UART0))instead.
Themes
| Theme | Style |
|---|---|
| 🌙 VS Code Dark | Dark, default |
| ☀️ VS Code Light | Light |
| 🍬 Monokai | The classic editor dark theme |
| 🧛 Dracula | Purple and pink accents |
| 🌊 Solarized Dark | Muted, low contrast |
| 💻 Hacker (Matrix) | Monochrome green terminal |
Switching a theme repaints the interface, the plot palette and the Chart.js axes. Port tag colours stay fixed on purpose, so a board keeps its identity across themes.
Known limitations
- The interface, the command titles and the log messages are in Russian. Everything is icon- and keyboard-driven, so it is workable either way, but English localisation is on the roadmap.
- Backtrace decoding covers DWARF 2–4; DWARF 5 units are skipped and the address falls back to symbol-table resolution, giving a name without a line number.
- One symbol file is shared by all ports — two boards running different builds cannot both be decoded precisely at the same time.
- Error, crash and reboot counters are totals across all ports, unlike idle time and RTT which are per port.
- Warnings are not classified or counted, only errors, crashes and reboots.
- All plot series share one chart; there is no per-port chart.
- The separate window needs VS Code 1.85 or newer. On 1.84 the monitor opens as an ordinary tab and says so in the log; everything else works the same.
- Board numbers are remembered for the lifetime of the panel, not across editor restarts.
- Two identical CH340-class clones have no USB serial number to tell them apart, so their numbers are only sorted out once each has printed its MAC.
- Project integration reads
platformio.inionly — Arduino CLI is not recognised yet.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
Порт занят другой программой |
Something else holds the port — usually the PlatformIO monitor terminal or a running upload. Close it and reconnect. |
No native build was found for platform=… runtime=electron abi=… |
The bundled serialport binary does not match your editor's Electron. Rebuild it against the version from Help → About: npx @electron/rebuild -v <Electron version> |
| Permission denied on Linux | Add your user to the dialout group and re-login. |
Backtrace shows symbol +0xoffset |
The build uses DWARF 5. The function name is correct, the line number is not available yet — see the roadmap. |
| A board still changes its number | Its adapter reports no USB serial number, and the firmware never prints a MAC. Print the MAC on startup (WiFi.macAddress() or esp_read_mac) and the number will stick from the next connect on. |
| Ctrl+K M does nothing | Open SUS Monitor: показать журнал first: if there is no Команда susSerialMonitor.openAndConnect line, the keypress never reached the extension. Likely causes, in order: focus is not in an editor (the binding declares editorTextFocus); the chord was typed too slowly and VS Code dropped it; the built-in Change Language Mode command, which also ships on Ctrl+K M, won the key. Check Ctrl+K Ctrl+S → filter ctrl+k m → right-click → "Show Same Keybindings", and rebind if something else owns it. The status bar button works regardless. |
| The monitor opens as a tab, not a window | VS Code moves the tab out with its own command, and it only exists since 1.85. SUS Monitor: показать журнал names the reason. On a new enough editor you can always do it by hand: right-click the tab → Move into New Window. |
| Nothing happens at all | Open SUS Monitor: показать журнал. Every silent fallback writes its reason there. |
Also available without VS Code
The same monitor builds into a single self-contained HTML file that runs on the Web Serial API — double-click it in Chrome or Edge, no install, no Node. Both targets are generated from one shared core, so features land in both. See the developer README for build instructions.
Roadmap
Ordered roughly by how often the absence of each one gets in the way.
| Planned | What it changes |
|---|---|
| DWARF 5 backtraces via the toolchain | Resolve addresses through the PlatformIO toolchain's addr2line when available, falling back to the bundled parser. This is what makes exact file:line work on current ESP-IDF builds. |
| English UI localisation | Move interface strings into l10n bundles so the palette, toolbar and log follow the editor language. |
| HEX view | A byte-level view for binary protocols, next to the text terminal. |
| Command history | Arrow-key recall in the send field, plus saved snippets per project. |
| Warning classification | A fourth counter next to errors, crashes and reboots. |
| Port profiles | Remember baud rate, line ending and filter per port, per workspace — including board numbers across restarts. |
| Configurable plot parsing | Plot key:value pairs and named series, so the legend reads like your firmware rather than S1, S2. |
| Per-port counters and charts | Split error/crash/reboot counters, and optionally the chart, by source port. |
| Arduino CLI support | Read sketch.yaml the way platformio.ini is read now. |
Ideas and bug reports are welcome at github.com/<OWNER>/<REPO>/issues.
License
MIT
Русский
- Зачем
- Возможности
- Требования
- Быстрый старт
- Команды
- Интерфейс
- Работа с несколькими портами
- Плоттер
- Отладка ESP32
- Интеграция с PlatformIO
- Темы оформления
- Известные ограничения
- Если что-то не работает
- Работает и без VS Code
- План развития
- Лицензия
Зачем
Большинство мониторов порта отдают поток текста и на этом заканчиваются. Это устраивает до первой перезагрузки платы посреди лога, до первой паники с сырым Backtrace: 0x400d1a2b:0x3ffb1f30 и до момента, когда две платы нужно увидеть рядом на одной шкале времени.
Расширение сделано именно под эту часть работы:
- порт открывает само — поэтому сброс платы, вывод
setup()и несколько портов с общими часами работают, а не теряются внутри обёрнутого CLI-монитора; - читает ваш
platformio.ini— порт и скорость берутся из проекта, а на время прошивки порт отдаётся автоматически; - декодирует backtrace ESP32 в
функция → файл:строкапо тому ELF, который уже собрал ваш проект.
Возможности
- 📟 Терминал — приём и отправка по UART с метками времени до миллисекунды, автоскроллом и цветовой подсветкой RX / TX / системных сообщений
- 🪟 Отдельное окно — монитор открывается своим окном редактора: лог живёт рядом с кодом, а не отъедает половину экрана
- 🔌 Несколько портов одновременно — две и более платы в одной панели, каждая строка и каждая линия графика помечена цветным тегом порта (
P1,P2…), общая шкала времени - 🏷️ Постоянные номера плат — номер
Pзакреплён за платой и переживает переподключение, даже если система выдала другой путь порта - 🔎 Живой фильтр — скрывает несовпадающие строки на лету, и уже показанные, и все приходящие дальше
- 📈 Плоттер в реальном времени (Chart.js) — строит график по числам в строке, несколько линий на порт и несколько портов на одном графике
- 🖼️ Экспорт графика — PNG (снимок) и CSV (сырые точки для Excel или pandas)
- 💾 Запись лога в файл в реальном времени — каждая строка дописывается в файл по мере поступления, а не только по кнопке «Сохранить»
- 📊 Отладочная статистика — простой и время отклика (RTT) отдельно по каждому порту, плюс счётчики ошибок, крашей и перезагрузок
- 🧩 Декодирование Backtrace — строки
Backtrace:раскрываются вфункция → файл:строкавстроенным парсером DWARF, без вызова внешнего тулчейна - 🔄 Сброс платы для каждого порта — импульс DTR/RTS с чипа порта; управляющие линии остаются снятыми, поэтому физическая кнопка RESET запускает прошивку, а не загрузчик
- ⚙️ Интеграция с PlatformIO — порт и скорость из
platformio.ini, автоматическое освобождение и переподключение вокруг задач прошивки - 🎨 6 тем оформления — VS Code Dark/Light, Monokai, Dracula, Solarized Dark, Hacker (Matrix), выбор сохраняется между сессиями
- 📄 Экспорт и копирование — терминал в
.txtили весь лог в буфер обмена - ⚡ Свой доступ к порту — порт открывает модуль
serialportв extension host, а не обёртка над CLI
Требования
| Требование | Пояснение |
|---|---|
| VS Code | 1.84 или новее. |
platformio.ini в папке |
Нужен только для интеграции с проектом: порт, скорость и синхронизация с прошивкой. Сам монитор открывается в любой папке. |
| PlatformIO IDE | Не обязателен. Нужен только ради самих задач сборки, с которыми синхронизируется монитор. |
| Драйвер устройства | Как обычно для платы: CP210x, CH340, FTDI и т. д. — должен стоять в системе. |
| Нативный модуль | serialport поставляется вместе с расширением и собран через N-API, поэтому работает на разных версиях Electron. Если порт не открывается — см. ниже. |
Быстрый старт
- Нажмите ⏻ SUS Monitor в строке состояния, внизу справа. Монитор откроется в отдельном окне, портов при этом не трогая, — его можно унести на второй экран рядом с кодом, и он там останется.
- В проекте PlatformIO есть путь короче: поставьте курсор в любой редактор и нажмите Ctrl+K M (на macOS Cmd+K M) — монитор откроется и сразу подключится к плате. Это аккорд: удерживая Ctrl, нажмите K, отпустите, нажмите M.
- В остальных случаях порт добавляется кнопкой + Добавить порт в панели инструментов.
- Наберите команду в поле внизу и нажмите Enter. Окончание строки выбирается рядом, по умолчанию
\r\n. - Числа во входящих строках сами появятся на вкладке Плоттер.
Ничего не приходит? Откройте SUS Monitor: показать журнал. Ошибки порта и проблемы с загрузкой символов пишутся туда и в терминал — там и живёт причина: не открылся порт, не нашёлся firmware.elf, задача прошивки не распознана.
Команды
Доступны из палитры команд (Ctrl+Shift+P) — достаточно набрать SUS.
| Команда | Что делает |
|---|---|
SUS Monitor: открыть монитор |
Открывает панель, не трогая порты |
SUS Monitor: открыть и подключиться к плате |
Открывает и подключается по platformio.ini (Ctrl+K M, нужен фокус в редакторе) |
SUS Monitor: показать журнал |
Открывает канал диагностики SUS Monitor в панели «Вывод» |
Первая команда висит ещё и на кнопке ⏻ SUS Monitor в строке состояния, а пока активен файл platformio.ini — и в заголовке редактора.
Интерфейс
Тулбар
| Элемент | Назначение |
|---|---|
| + Добавить порт | Выбор порта из списка (платы наверху) и подключение его как отдельного соединения |
| Baud rate | Скорость для следующего подключаемого порта; уже открытые сохраняют свою |
| Тема | Выбор темы оформления |
| Чипы портов | По одному на подключённый порт: цветной индикатор, скорость, сброс (↺) и отключение (✕) |
| 🧩 .elf/.map | Загрузка файла символов вручную: .elf даёт файл и строку, .map — только имена |
| 🔴 Запись в файл | Начинает и останавливает запись лога в файл в реальном времени |
| Монитор / Плоттер | Переключение вкладок |
| Автоскролл / Время | Чекбоксы поведения терминала |
| Поле фильтра | Скрывает строки лога без указанной подстроки |
| Точек | Сколько последних точек хранит плоттер, по умолчанию 50 |
| 🖼️ PNG / 📄 CSV | Экспорт графика, виден на вкладке «Плоттер» |
| Счётчик RX | Живой трафик по всем портам: байты, строки, байты в секунду |
| 📊 Статистика | Открывает панель отладочной статистики |
| Очистить | Очищает терминал, график и счётчики; порты остаются подключёнными |
| Копировать | Копирует весь лог терминала в буфер обмена |
| Сохранить лог | Разовый экспорт лога в .txt |
Нижняя панель ввода
Целевой порт для команды, окончание строки (нет, \n, \r, \r\n — по умолчанию), само поле ввода и кнопка Отправить.
Работа с несколькими портами
Каждое нажатие + Добавить порт создаёт независимое соединение — столько, сколько разрешит система.
- У каждого порта своя скорость, выбранная на момент подключения.
- Терминал и плоттер общие, но каждая строка и линия помечена цветом и тегом своего порта — два устройства выстраиваются на одной шкале времени.
- Отправить в выбирает, какому порту адресована следующая команда.
- Сброс (↺) и отключение (✕) действуют на один порт, со своего чипа.
- Простой и RTT считаются отдельно по каждому порту, поэтому зависшее устройство видно, а не выглядит как молчащая панель.
- Счётчики ошибок, крашей и перезагрузок — общие по всем портам (см. ограничения).
Как за платой закрепляется номер
Плату выдернули и вставили обратно — система может выдать ей другой путь: COM5 превращается в COM7, /dev/ttyUSB0 в /dev/ttyUSB1. Номер в чипе порта держится за устройством, а не за путём, поэтому P1 остаётся P1, а не растёт с каждым переподключением, разрывая линии графика на новые серии.
Опознание, от надёжного к слабому:
| Источник | Когда работает |
|---|---|
| Серийный номер USB | CP210x, FTDI, встроенный USB у ESP32-S2/S3/C3 — известен сразу при открытии порта |
| VID/PID USB | У любого переходника, но опознаёт только модель: два одинаковых клона на CH340 дают один ключ |
| MAC-адрес из лога загрузки | У любой ESP, которая печатает MAC при старте. Самый надёжный из трёх, но приходит через секунду-две после открытия порта |
Когда MAC приходит и говорит, что плата принадлежит свободному сейчас номеру, соединение переезжает туда, о чём пишется в терминал. Если для порта уже нарисована линия на графике, номер не трогается: перенумерация оторвала бы серию от данных. MAC запоминается в любом случае, поэтому следующее подключение опознаётся сразу.
MAC, за которым закреплён номер, виден во всплывающей подсказке чипа порта.
Плоттер
- Числа разбираются из каждой строки, разделители — пробелы и запятые.
- Каждая позиция в строке даёт свою линию для своего порта (
P1 · S1,P1 · S2,P2 · S1…), цвет берётся из палитры текущей темы. - Пропущенное значение оставляет разрыв, а не падение в ноль.
- Глубина истории — поле Точек, по умолчанию 50.
- PNG сохраняет текущий снимок канваса, CSV — все точки всех линий с их метками времени.
Отладка ESP32
Ошибки, перезагрузки и краши распознаются и считаются на ходу.
| Счётчик | Что попадает |
|---|---|
| Ошибок в логе | error, ошибка, exception, fail, failed, panic, паника |
| Крашей (Backtrace) | строка Backtrace:, Guru Meditation, fatal exception, abort() was called, assert failed |
| Обнаружено перезагрузок | Маркеры старта ESP32/Arduino: rst:0x, ets Jun, ets Jul, rebooting, reset reason, boot:0x13, power on reset |
Когда в логе появляется строка Backtrace:, её адреса расшифровываются прямо под ней:
Backtrace:0x400d1fb9:0x3ffb21a0 0x400d2c85:0x3ffb21c0
[DECODE] 0x400d1fb9 → loop() at main.cpp:142
Символы подхватываются сами: при открытии панели берётся самый свежий firmware.elf из .pio/build, указывать руками ничего не нужно. Кнопка 🧩 .elf/.map нужна для случаев, когда требуется другая сборка.
Декодирует встроенный парсер DWARF, а понимает он DWARF 2–4. Актуальные версии ESP-IDF собирают с DWARF 5, и на таких сборках backtrace вырождается в символ +0xсмещение из таблицы символов ELF вместо точной строки. Разрешение адресов через addr2line из тулчейна — первый пункт плана развития.
Интеграция с PlatformIO
monitor_portиmonitor_speedчитаются изplatformio.iniс учётом наследования от[env]иdefault_envs.- Если
monitor_portне задан, берётся первый порт, похожий на плату — по USB VID известных USB-UART (CP210x10c4, CH3401a86, FTDI0403, Arduino2341, Espressif303a, Adafruit239a) и по названию устройства. Если на плату не похож ни один, берётся первый доступный. - При старте задачи upload порт освобождается, чтобы его занял загрузчик.
- После завершения задачи монитор переподключается с повторами, потому что плата возвращается в систему не мгновенно. Если прошивка упала, порт остаётся закрытым.
- При открытии порта DTR и RTS снимаются. Равные уровни на обеих линиях схему авто-сброса не трогают, поэтому кнопка RESET на плате запускает прошивку. При поднятом DTR и снятом RTS — а именно так порт открывает драйвер Windows — то же нажатие уводит плату в
rst:0x1 (POWERON),boot:0x2 (DOWNLOAD(USB/UART0)).
Темы оформления
| Тема | Стиль |
|---|---|
| 🌙 VS Code Dark | Тёмная, по умолчанию |
| ☀️ VS Code Light | Светлая |
| 🍬 Monokai | Классическая тёмная тема редакторов |
| 🧛 Dracula | Фиолетово-розовые акценты |
| 🌊 Solarized Dark | Приглушённая, низкий контраст |
| 💻 Hacker (Matrix) | Моно-зелёный терминальный стиль |
При смене темы перекрашивается интерфейс, палитра линий графика и оси Chart.js. Цвета тегов портов фиксированы специально: плата сохраняет свою метку при любой теме.
Известные ограничения
- Декодирование backtrace покрывает DWARF 2–4; юниты DWARF 5 пропускаются, адрес разрешается по таблице символов — имя функции есть, номера строки нет.
- Файл символов один на все порты: две платы с разными прошивками одновременно точно не декодируются.
- Счётчики ошибок, крашей и перезагрузок суммарные по всем портам, в отличие от простоя и RTT, которые считаются отдельно.
- Предупреждения не выделяются и не считаются — только ошибки, краши и перезагрузки.
- Все линии живут на одном графике, отдельного графика на порт нет.
- Отдельное окно требует VS Code 1.85 или новее. На 1.84 монитор откроется обычной вкладкой и напишет об этом в журнал — всё остальное работает так же.
- Номера плат помнятся, пока открыта панель, но не переживают перезапуск редактора.
- Два одинаковых клона на CH340 различить по USB нечем, поэтому их номера расходятся только после того, как каждый напечатает свой MAC.
- Интеграция с проектом читает только
platformio.ini— Arduino CLI пока не распознаётся. - Интерфейс и сообщения журнала на русском; английская локализация в плане ниже.
Если что-то не работает
| Симптом | Причина и что делать |
|---|---|
Порт занят другой программой |
Порт держит кто-то ещё — обычно терминал монитора PlatformIO или идущая прошивка. Закройте и подключитесь заново. |
No native build was found for platform=… runtime=electron abi=… |
Нативный serialport собран не под ту версию Electron. Пересоберите под версию из «Справка → О программе»: npx @electron/rebuild -v <версия Electron> |
| Нет прав на порт в Linux | Добавьте пользователя в группу dialout и перезайдите в систему. |
В backtrace символ +0xсмещение |
Сборка с DWARF 5. Имя функции верное, номер строки пока недоступен — см. план развития. |
| Плата всё равно меняет номер | У её переходника нет серийного номера USB, а прошивка не печатает MAC. Выведите MAC при старте (WiFi.macAddress() или esp_read_mac) — со следующего подключения номер закрепится. |
| Ctrl+K M ничего не делает | Сначала откройте SUS Monitor: показать журнал: если строки Команда susSerialMonitor.openAndConnect там нет, нажатие до расширения не дошло. Причины по частоте: фокус не в редакторе (сочетание объявлено с editorTextFocus); аккорд набран слишком медленно и VS Code его сбросил; клавишу перехватила встроенная команда «Change Language Mode», которая по умолчанию тоже висит на Ctrl+K M. Проверьте Ctrl+K Ctrl+S → фильтр ctrl+k m → правый клик → «Show Same Keybindings» и при конфликте назначьте своё сочетание. Кнопка в строке состояния работает в любом случае. |
| Монитор открылся вкладкой, а не окном | Вкладку уносит своя команда VS Code, а она есть только с версии 1.85. Причина написана в SUS Monitor: показать журнал. На свежем редакторе то же самое всегда можно сделать руками: правый клик по вкладке → Переместить в новое окно. |
| Не происходит вообще ничего | Откройте SUS Monitor: показать журнал — каждый тихий откат пишет туда свою причину. |
Работает и без VS Code
Тот же монитор собирается в один самодостаточный HTML-файл поверх Web Serial API: двойной щелчок в Chrome или Edge, без установки и без Node. Обе цели собираются из общего ядра, поэтому возможности появляются сразу в двух. Инструкции по сборке — в README для разработчика.
План развития
Порядок примерно соответствует тому, как часто не хватает каждого пункта.
| Планируется | Что изменится |
|---|---|
| Backtrace на DWARF 5 через тулчейн | Разрешать адреса через addr2line из тулчейна PlatformIO, когда он доступен, с откатом на встроенный парсер. Именно это даёт точные файл:строка на актуальных сборках ESP-IDF. |
| Английская локализация интерфейса | Вынести строки в бандлы l10n, чтобы палитра, тулбар и журнал следовали языку редактора. |
| HEX-режим | Побайтовый вид для бинарных протоколов рядом с текстовым терминалом. |
| История команд | Перебор стрелками в поле отправки и сохранённые заготовки на проект. |
| Классификация предупреждений | Четвёртый счётчик рядом с ошибками, крашами и перезагрузками. |
| Профили портов | Запоминать скорость, окончание строки и фильтр для каждого порта в рамках рабочей папки — вместе с номерами плат между перезапусками. |
| Настраиваемый разбор для графика | Рисовать пары ключ:значение и именованные серии, чтобы легенда читалась как ваша прошивка, а не как S1, S2. |
| Счётчики и графики по портам | Разбить счётчики ошибок, крашей и перезагрузок — и при желании график — по портам-источникам. |
| Поддержка Arduino CLI | Читать sketch.yaml так же, как сейчас читается platformio.ini. |
Идеи и сообщения об ошибках — в github.com/<OWNER>/<REPO>/issues.
Лицензия
MIT