Простой многофункциональный терминал для виртуальных и COM-портов под Windows 7+.
WT232 — универсальный Windows-терминал для COM-портов. Поддерживает TEXT/DUMP режимы, 120 макросов (5×24), систему скриптов с расширением .wts, автоподключение USB-устройств по VID/PID, систему из 10 автоответов (Auto Reply).
- Работа с COM-портами (USB CDC/ACM, стандартные UART)
- Режимы отображения приема: TEXT (текст), DUMP (HEX + ASCII)
- Режимы отправки: TEXT с инлайн-HEX (в обратных кавычках
`XX`) - Поддержка кодировок: UTF-8, CP1251, CP866, KOI8-R (оптимизировано для кириллицы)
- Автоподключение USB-устройств по VID/PID/Serial Number
- Многопоточная архитектура (отдельные потоки Rx/Tx) для высокой отзывчивости
- Поддержка пользовательской скорости (Custom Baud Rate)
- Режимы работы: RUN (выполнение) / EDIT (редактирование)
- Переключение отображения: LABEL (имя) / CMD (команда)
- Переименование банков (только заголовок, без переименования файла скрипта)
- Сохранение в INI-файле
- Кнопка SEND в окне Edit Macro: отправка текущего содержимого строки CMD в порт без сохранения в банк (окно остаётся открытым)
- Глобальный скрипт:
[имя_программы]#0.wts - Скрипты макросов:
[имя_программы]#1.wts...[имя_программы]#5.wts - Автоматическое создание при нажатии SCRIPT (с примером)
- Инлайн-HEX/DEC внутри
`...` - Директивы:
#DELAY,#STOP,#WAIT - Циклическое выполнение (без #STOP)
- Автоматическая отправка команды при получении данных, содержащих триггер
- До 10 правил с индивидуальным включением/отключением
- Настраиваемая задержка перед отправкой ответа (мс)
- Поддержка инлайн-HEX/DEC в триггере и ответе
- Отдельное окно настроек с таблицей правил
- Сохранение правил в INI-файле
- Кнопки скриптов:
[?] [SCRIPT] [RUN](слева) - Чекбокс UP: окно всегда поверх других
- Чекбокс HEX: отображение отправленных данных в HEX-формате в окне эха
- Чекбокс DUMP: переключение режима приема между текстом и дампом
- Кнопка Folder: открыть папку с программой в проводнике Windows
- Настраиваемый размер шрифта (8–16 pt)
- Суффиксы отправки (автоматическое добавление CR/LF или HEX-байтов)
NONE— без управленияRTS/CTS— аппаратное рукопожатиеXON/XOFF— программное управлениеRTS Toggle— переключение RTS (RS-485)RTS Toggle (Inverted)— инвертированное переключение RTS
- Windows 7 и выше
- 32-бит (x86) или 64-бит (совместимость)
Проект разработан в среде Pelles C for Windows, версия 14.50.0 (C11 standard).
⚠️ Важно: Исходный файлmain.cсохранен в кодировке UTF-16 LE (with BOM). Это необходимо для корректной обработки широких строк (wchar_t) и кириллицы в режиме Unicode. При редактировании файла убедитесь, что ваш редактор поддерживает эту кодировку и не конвертирует её в UTF-8 автоматически.
- Установите Pelles C
- Откройте файл проекта
WT232.ppj. При необходимости подключите в проекте нужный файлmain.c - Выберите конфигурацию сборки: Release
- Нажмите Build (F7)
Все перечисленные библиотеки входят в состав Windows SDK и Pelles C, отдельная установка не требуется. Однако их необходимо явно указать в настройках проекта:
Project → Project Options → Compiler → C standard — установите C11 (если не выбран по умолчанию).
Project → Project Options → Linker → Library and object files — добавьте перечисленные библиотеки через пробел (setupapi.lib shell32.lib kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib).
| Библиотека | Назначение |
|---|---|
kernel32.lib |
Базовые системные функции: управление памятью, потоками, файлами, таймерами |
user32.lib |
Оконные процедуры, элементы управления, сообщения, диалоговые окна |
gdi32.lib |
Графические функции: шрифты, рисование, контексты устройств |
comctl32.lib |
Общие элементы управления (Common Controls): RichEdit, ToolTip и др. |
advapi32.lib |
Расширенные системные функции: реестр Windows, INI-файлы |
shell32.lib |
Функции оболочки: ShellExecute (открытие папки в проводнике) |
setupapi.lib |
Обнаружение USB-устройств и получение VID/PID/Serial Number |
- Новая директива
#WAIT [KEY]: пауза скрипта; выход — по любой клавише в любом окне (макрос-панель или терминал); аргумент клавиши (SPACE, ENTER, ESC, F1-F12, A-Z, 0-9) — подсказка ожидаемой (неизвестное имя — строка игнорируется) - Состояние ожидания: подсказочный лейбл в строке правее кнопки RUN («WAIT: любая клавиша»); кнопка RUN показывает
WAIT(клик — стоп); маркеры не пишутся в RX-область терминала - Парсер: вырезание UTF-8 BOM из первой строки
.wts(Notepad «UTF-8 с BOM»); триггер#WAITтолерантен к хвостовому пробелу/табу - Исправлено: остаточный периодический таймер во время ожидания больше не автопродвигает скрипт (
KillTimerпри входе в паузу + guard в раннерах) - Исправлено: кнопка STOP не останавливала глобальный скрипт в быстром цикле — скрипт теперь отправляет команды напрямую, без переписывания строки отправки; при закрытии окна терминала состояние скрипта сбрасывается
- Директива описана в справке (?) окна макросов и терминала, в шаблоне создаваемого файла
.wtsи в таблице «Директивы»
Окно Edit Macro:
- В окно Edit Macro добавлена кнопка «Send» (слева внизу, ниже строк Name/CMD)
- В режиме MODE: EDIT отправляет текущее содержимое строки CMD в порт без сохранения в банк; окно остаётся открытым
- Порт не открыт — MessageBox «Порт не открыт!»
- Диагностика: при сбое отправки SEND — MessageBox с причиной (команда пустая/парсинг, таймаут записи 5 с, код ошибки записи)
Ядро отправки и асинхронные записи (исправление дефекта):
- Ядро отправки вынесено в
SendMacroTextRaw(общее для RUN-режима и кнопки SEND) - Исправлен дефект асинхронной записи: при
ERROR_IO_PENDINGуспех определялся по первому ответуWriteFile— успешно завершившаяся асинхронная запись не показывала эхо, а SEND сообщался ложный сбой. Теперь успех — по завершению ожидания (WAIT_OBJECT_0). Затронуто: SEND/RUN, макроскрипты (RunNextMacroScriptCommand), автоответчик
Окно макроса (панель 5×24):
- Сохраняется размер окна в
[MacroPos_%d](ключиW/H) вместе с позицией (X/Y) - Размер восстанавливается при повторном открытии панели
- Добавлен
WM_EXITSIZEMOVEдля записи состояния по завершении изменения размера
Окно редактирования макроса:
- Окно стало изменяемым по ширине для удобного ввода длинных команд
- Поля Name/CMD растягиваются по ширине, кнопки Save/Cancel выравниваются по правому краю
- Размер и положение сохраняются в
[MacroEdit](X/Y/W) - Высота фиксирована (изменение высоты непрактично)
Новая архитектура чтения USB информации:
- Реализовано прямое чтение USB дескрипторов через
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION - Убраны зависимости от PowerShell и чтения реестра для получения Product/Manufacturer/Serial
- Добавлены функции:
ReadUsbStringFromHubW(),ExtractPortFromLocationW(),ReadUsbDescriptorsDirectW() - Используются прямые Windows API вызовы для доступа к USB хабу
Исправления:
- Исправлена классификация портов: теперь правильно определяются USB CDC устройства vs стандартные последовательные порты
- Неправильно определялся класс для PCI и виртуальных портов (com0com)
Результат: Теперь программа показывает точные значения из USB дескрипторов:
- VID/PID: из Device Descriptor
- Manufacturer: из USB String Descriptor 1 (например, "Deqing")
- Product: из USB String Descriptor 2 (например, "CH55xduino")
- Serial: из USB String Descriptor 3 (например, "CH55x")
Утечки ресурсов:
- Исправлена утечка дескриптора DLL:
riched20.dllтеперь загружается с сохранением хэндла (g_hRichEdLib) и освобождается черезFreeLibraryпри завершении программы - Исправлена утечка GDI-объектов: 23 статических кисти (
HBRUSH), создававшиеся черезCreateSolidBrushв обработчикахWM_ERASEBKGND/WM_CTLCOLOR*в разных окнах и диалогах, заменены на 3 глобальные кисти (g_hBrushBg,g_hBrushBtn,g_hBrushEdit), которые освобождаются черезDeleteObjectпри выходе изWinMain - Статические переменные
HWNDдля диалогов справки (hMacroHelpDlg,hSuffixInfoDlg,hScriptInfoDlg) переведены в глобальные, с корректным уничтожением черезDestroyWindowпри закрытии родительских окон - Добавлен обработчик
WM_DESTROYвInfoWndProcдля сбросаhEditLog = NULL
Буферные переполнения:
- Исправлено переполнение массива
tokens[512]вparse_text_with_inline_hex: добавлена проверкаtokenCount < 512перед каждой записью - Исправлено потенциальное переполнение буфера
wBufвrender_rx_buffer: жёстко заданные размерыswprintf(12, 4) заменены динамическимmaxW - wLen; добавлены проверки границ для прямых записейwBuf[wLen++]
Логические ошибки:
- Исправлена ошибка автоответа: эхо теперь использует ответ совпавшего правила (
g_arMatchedRule) вместо жёсткого индекса[0]
Исходный код открыт для модификации. Вы можете:
- Добавлять новые функции
- Менять поведение существующих
- Адаптировать под свои нужды
- Исправлять ошибки
Проект написан на чистом Win32 API (без сторонних библиотек) и использует только стандартные компоненты Windows.
Весь код находится в одном файле main.c, что упрощает навигацию и модификацию.
Вы можете распространять измененные версии программы при соблюдении условий лицензии MIT (см. раздел "Лицензия").
Рекомендуется указывать:
- Что программа основана на WT232
- Ссылку на оригинальный репозиторий
- Ваши изменения в отдельном файле или разделе README
Программа не требует установки. Достаточно извлечь файл WT232.exe из архива, разместить его в любой папке и запустить.
Настройки сохраняются в файле WT232.ini в той же папке.
- Запустите
WT232.exe - В окне настроек выберите COM-порт и параметры соединения
- Нажмите OK для открытия терминала
- Для отправки данных введите текст в поле ввода и нажмите SEND
- Принимаемые данные отображаются в главном окне
| Клавиша/Элемент | Действие |
|---|---|
| F1 / Кнопка Info | Открыть окно "О программе" и справку |
| Чекбокс UP | Закрепить окно терминала поверх всех остальных окон |
| Чекбокс HEX | Включить отображение отправленных данных в HEX-формате (в эхо-режиме) |
| Чекбокс DUMP | Переключить режим отображения принимаемых данных (TEXT ↔ DUMP) |
| Кнопки M1–M5 | Открыть соответствующую панель макросов |
| Чекбокс Auto Reply | Включить/выключить систему автоответа |
| Кнопка Auto Reply | Открыть окно настроек автоответа |
| Кнопка Folder | Открыть папку с программой в проводнике Windows |
| Enter (в поле ввода) | Отправить команду (аналог кнопки SEND) |
Для открытия панели макросов нажмите одну из кнопок M1–M5 в нижней части главного окна. Программа поддерживает 5 банков макросов по 24 ячейки в каждом (всего 120 команд).
- R→E / E→R — Переключение режима работы панели:
- MODE: RUN: Нажатие на ячейку отправляет команду в порт
- MODE: EDIT: Нажатие на ячейку открывает окно редактирования названия и команды
- Кнопка SEND (в окне Edit Macro, слева внизу): отправляет текущее содержимое строки CMD в порт. Команда отправляется без сохранения в банк (Save сохраняется), окно остаётся открытым для итеративного тестирования; при закрытом порте — MessageBox «Порт не открыт!»
- LABEL/CMD — Переключение отображения текста на кнопках: показывать пользовательское название (Label) или саму команду (Command)
- Редактирование названия банка: В режиме EDIT кликните по полю с названием банка (вверху окна) для его переименования. Файл скрипта при этом не переименовывается и остается привязанным к индексу банка (
#1...#5).
Каждое окно макросов имеет собственную панель управления скриптами внизу:
| Кнопка | Действие |
|---|---|
| ? | Открыть справку по формату скрипта |
| SCRIPT | Создать/открыть файл скрипта для текущего банка |
| RUN/STOP | Запустить/остановить выполнение скрипта |
Особенности:
- Файл скрипта создается автоматически при нажатии SCRIPT
- Имя файла соответствует индексу банка (
[имя_программы]#1.wts...[имя_программы]#5.wts) - Скрипт, привязанный к конкретному банку макросов, выполняется независимо от основного терминала
- Если соединение с портом пропадает во время выполнения, скрипт автоматически останавливается
В главном окне терминала также доступна система скриптов:
| Кнопка | Действие |
|---|---|
| ? | Открыть справку по формату скрипта |
| SCRIPT | Создать/открыть глобальный файл скрипта |
| RUN/STOP | Запустить/остановить выполнение скрипта |
Особенности:
- Имя файла:
[имя_программы]#0.wts(например,WT232#0.wts) - Файл создается автоматически при нажатии SCRIPT
Система автоответа позволяет автоматически отправлять команды при получении определённых данных из порта.
- Установите чекбокс Auto Reply в главном окне терминала
- Нажмите кнопку Auto Reply для открытия окна настроек
- Включите нужные правила чекбоксами (1–10)
- Задайте триггер (что ищем в принятых данных)
- Задайте ответ (что отправляем)
- Укажите задержку в миллисекундах
- Нажмите Сохранить
| Формат | Описание | Пример |
|---|---|---|
| ASCII текст | Обычная строка | AT, OK, +CME |
| Инлайн-HEX | Байты в обратных кавычках | `0D0A` → CR+LF |
| Инлайн-DEC | DEC значения (3 цифры) | `011` → 0x0B |
| Смешанный | Комбинация текста и HEX | AT+ `0D0A` |
Примечание: Срабатывает только первое совпавшее правило (приоритет по порядку сверху вниз).
Скрипт представляет собой обычный текстовый файл с расширением .wts, где каждая строка — это отдельная команда.
# WT232 Terminal Script
# Каждая строка - одна команда
# Поддерживается инлайн-HEX/DEC внутри `...`
# Директивы (в начале строки):
# DELAY 500 - задержка перед следующей командой (мс)
# STOP - остановить выполнение скрипта
# WAIT SPACE - пауза скрипта; выход - по любой клавише в любом окне (аргумент - подсказка)
# ... - комментарий
# Примеры команд:
AT
AT+BAUD=9600
`0D0A` -> CR+LF
`011 001 255` -> 0B 01 FF
| Директива | Описание |
|---|---|
1000 |
Глобальная задержка (мс) в первой строке файла |
#DELAY 500 |
Задержка перед следующей командой (мс) |
#STOP |
Остановить выполнение скрипта |
#WAIT [KEY] |
Пауза скрипта; выход — по любой клавише в любом окне (макрос-панель или терминал). Аргумент клавиши (SPACE, ENTER, ESC, F1-F12, A-Z, 0-9) — подсказка ожидаемой клавиши |
# ... |
Комментарий (игнорируется) |
Внимание: Без директивы
#STOPскрипт выполняется циклически (после последней команды начинает сначала).
Внутри текстовых команд можно использовать HEX и DEC значения в обратных кавычках:
| Синтаксис | Описание | Пример |
|---|---|---|
2 символа |
HEX (AA) | `0D0A` → CR+LF |
3 символа |
DEC 000..255 (011) | `011 001 255` → 0x0B 0x01 0xFF |
4+ символов |
HEX чётной длины | `0D0A` → 0x0D 0x0A |
Разделители: пробел, запятая, точка
Примеры:
AT+CPIN=`0D0A` # AT+CPIN= с CR+LF
`01 02 03 04` # Отправка байтов 0x01 0x02 0x03 0x04
`011 001 255` # Отправка байтов 0x0B 0x01 0xFF
`AA,bb,123.01` # Отправка байтов 0xAA 0xBB 0x7B 0x01
| Режим | Описание |
|---|---|
| NONE | Управление отсутствует. Используйте для простых TTL-переходников, отладки или когда линии RTS/CTS физически не подключены. |
| RTS/CTS | Классическое аппаратное рукопожатие. Устройство сигнализирует о готовности через RTS и проверяет готовность собеседника через CTS. Наиболее надежно для высокоскоростной передачи. |
| XON/XOFF | Программное управление символами XON(0x11)/XOFF(0x13). Не требует дополнительных проводов. Может конфликтовать с передачей бинарных данных, содержащих эти коды. |
| RTS Toggle | Линия RTS автоматически переключается драйвером: HIGH во время передачи (TX Enable), LOW в покое. Предназначено для полудуплексных шин RS-485. |
| RTS Toggle (Inverted) | Инвертированная логика RTS: LOW во время передачи (TX Enable), HIGH в покое. Используется для некоторых RS-485 адаптеров. |
Все настройки сохраняются в файле WT232.ini в той же папке, что и программа.
При повреждении файла настроек программа автоматически создает резервную копию WT232.ini.bak и восстанавливает настройки.
assets/
screenshot1.png - Скриншот Стартовое окно (настройки UART)
screenshot2.png - Скриншот Окно терминала
screenshot3.png - Скриншот Кодировки и дополнительные окна
screenshot4.png - Скриншот Режим DUMP
main.c - Основной исходный файл (весь код в одном файле)
WT232.ppj - Файл проекта Pelles C
WT232.exe - Собранный исполняемый файл
WT232.ini - Файл настроек (создается автоматически)
WT232.ini.bak - Резервная копия настроек (создается автоматически)
WT232.wts - Глобальный скрипт (создается автоматически)
M1.wts, M2.wts... - Скрипты макросов (создаются автоматически)
LICENSE - Лицензия MIT
README.md - Этот файл
MIT License
Copyright (c) 2026 IgerOK
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
GitHub: https://github.com/IgerOK/WT232
Автор: IgerOK
Среда: Pelles C for Windows 14.50.0
Спасибо всем, кто тестирует и помогает улучшать WT232!
WT232 Terminal v0.6.5 — Простой, мощный и удобный инструмент для работы с COM-портами в WINDOWS 7+.



