Files
ewsdr/test/serial/README.md
T
ew8bakandClaude Opus 5 53c21223a3 fix(serial): COM10 и выше не открывались под Windows
CreateFile резолвит короткое имя порта только для COM1..COM9 — начиная с
COM10 нужна форма \\.\COM10. У USB-переходников номер за десяток заезжает
легко (воткнули пару кабелей — система выдала COM11), и оператор получал
«не удалось открыть» без всякого объяснения: имя уходило в CreateFile как есть.

SerOpen под Windows пропускает имя через новую чистую SerWinDeviceName:
COM1..COM9 остаются короткими (там и так работало, менять поведение незачем),
COM10 и выше получают префикс, уже полная форма не удваивается, всё, что не
похоже на COM<число> (пути Unix, COM3: с двоеточием), не трогается вовсе.

Функция считает одинаково на всех платформах и потому проверяется стендом на
Linux — 11 проверок в test/serial (итого 47). Подсказка под полем ввода на
Windows уже называет обе формы: «COM3, \\.\COM12».

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bkwwyj7xVRrqnSVEseTRfV
2026-08-24 22:16:58 +03:00

47 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Стенд последовательного порта
Проверяет обёртку `SerialPort.pas` на **псевдотерминале**: настоящего COM-порта
на сборочной машине нет, а проверить надо ровно то, на чём обжигается перенос —
как обёртка **настраивает** порт.
```
test/serial/run.sh
```
## Что проверяется
* **Открытие**: несуществующий порт даёт `SER_INVALID_HANDLE` (а не ноль и не
случайное число), живой — годный хендл.
* ★**Имя устройства для Windows**: `COM10` и выше `CreateFile` открывает только
в форме `\\.\COM10` — короткое имя система резолвит лишь для `COM1..COM9`, а у
USB-переходников номер за десяток заезжает легко. Правило чистое
(`SerWinDeviceName`), поэтому проверяется и на Linux: короткие имена не
трогаются, длинные получают префикс, уже полная форма не удваивается, пути
Unix не задеваются.
* **termios обратным чтением**: скорость, стоп-биты, `CREAD`/`CLOCAL`, сырой
режим (нет `ICANON`, `ECHO`, `OPOST`).
* ★**Аппаратный поток `CRTSCTS` не включается сам** — только по явной просьбе.
Это главная проверка стенда: на кабеле без CTS случайно включённый CRTSCTS
вешает передачу намертво, и никакой ошибки при этом нет. Ровно так ломается
RTL-модуль `Serial` на BSD и macOS — там B-константы это числа, а он кладёт
их в `c_cflag` (подробнее — в шапке `SerialPort.pas`).
* ★**В `c_cflag` нет ничего, кроме наших флагов** (маска `CBAUD` снимается) —
прямая ловушка на ту же ошибку. Негативный контроль: если в `SerSetParams`
дописать `or Cardinal(BitsPerSec)`, проверка падает с «1CAB0 против 8B0».
* **Формат** (размер символа, чётность, стоп-биты, флаг потока) — через чистую
`SerCFlags`. Обратным чтением его не проверить: pty восьмибитно-чистый, ядро
молча заменяет `CS7` на `CS8` и снимает `PARENB`.
* **Обмен**: запись и чтение в обе стороны, срок у `SerReadTimeout`, `CR` не
превращается в `CR+LF`, эха нет.
* **Сквозной прогон**: байты на мастере → поток `CATSerial``TCATEngine`
ответ обратно (командой `ID`, она отвечает константой и радио не трогает).
## Чего стенд НЕ проверяет
Модемные линии `DTR`/`RTS`/`CTS`/`DSR`/`CD`/`RI`: ioctl `TIOCM*` на
псевдотерминале не работает. Это остаётся на живой порт с железкой — там же
проверяется и телеграфный ключ на `CWKeyer`.
Компиляцию платформенных ветвей (Windows, macOS) проверяет соседний стенд
`test/platform`.