Files
ewsdr/test/serial/README.md
T
ew8bakandClaude Opus 5 03afaf3083 fix(serial): ноль — законный дескриптор, а имя порта нормализуем целиком
Два замечания по обёртке, оба верные.

1. SerValid считал ноль невалидным на всех платформах. На Unix дескриптор 0 —
   обычный номер: если стандартный ввод закрыт (демон, запуск из службы),
   fpOpen отдаст именно его. Порт при этом объявлялся неоткрытым И оставался
   незакрытым — SerClose смотрит на ту же проверку. Относительно прежней
   unix-проверки `h < 0` это была регрессия. Теперь признак неудачи ровно один
   и на всех платформах — SER_INVALID_HANDLE; ноль, которым RTL под Windows
   сообщает об отказе, переводится в него внутри SerOpen (как и было).

2. SerWinDeviceName обрезала пробелы только по пути COM10+. Для ' COM3 ' и
   ' \\.\COM12 ' возвращалось исходное имя с пробелами, а CreateFile их не
   прощает: оператор, скопировавший имя с хвостовым пробелом, получал «не
   удалось открыть» на ровном месте. Теперь опознанное имя возвращается
   нормализованным; неопознанное (путь на Unix, COM3: с двоеточием) — по-прежнему
   без единого изменения, трогать чужой путь мы не вправе.

Стенд: 52 проверки. Новая часть C2 закрывает стандартный ввод, открывает порт
как дескриптор 0 и гоняет через него байты — ★негативный контроль: с прежним
`and (Handle <> 0)` она падает двумя проверками. Плюс нормализация пробелов у
короткого имени и у полной формы.

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

52 lines
4.2 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` (а не ноль и не
случайное число), живой — годный хендл.
* ★**Дескриптор 0 — законный порт**: стенд закрывает стандартный ввод, после
чего порт открывается именно как `0`, и проверяет, что он считается годным и
через него идут данные. Признак неудачи ровно один — `SER_INVALID_HANDLE`.
Проверка вида «ноль = ошибка» теряла бы рабочий порт у демона и вдобавок не
закрывала дескриптор (`SerClose` смотрит на ту же проверку).
* ★**Имя устройства для 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`.