Files
ewsdr/test/serial/README.md
T
ew8bakandClaude Opus 5 05ba39fdad feat(serial): своя обёртка последовательного порта — macOS собирается
RTL-модуль Serial собирается только для [android, linux, netbsd, openbsd,
win32, win64] — Darwin в списке нет (rtl-extra/fpmake.pp). Из-за этого под
macOS CAT по последовательному порту стоял заглушкой, а CWKeyer не собирался
вовсе.

★Скопировать чужой исходник было нельзя. Serial.SerSetParams кладёт B-константу
скорости прямо в c_cflag — идиома Linux, где это битовая маска. На BSD и macOS
B115200 это просто ЧИСЛО 115200, и в c_cflag прилетает $1C200: CLOCAL | HUPCL |
CCTS_OFLOW плюс мусор в поле CSIZE. Молча включается аппаратный CTS-flow, и
передача встаёт, если железка не держит CTS, — а ошибки никакой, порт
«открылся».

Новый SerialPort.pas:
* Unix — termios напрямую, Linux и macOS ОДНИМ путём (разница спрятана в
  константах RTL; Darwin даёт и termio, и все TIOCM_*). Скорость только через
  CFSetISpeed/CFSetOSpeed, c_cflag собирается с нуля чистой SerCFlags;
  CRTSCTS — исключительно по явной просьбе; сырой режим и VMIN/VTIME явные;
  open с O_NONBLOCK и снятием флага сразу после (часть USB-драйверов, как и
  tty-устройство на маке, висит в open до DCD).
* Windows — тонкая переадресация в RTL Serial: там он есть и в termios не лезет.
* Неуспех SerOpen на ВСЕХ платформах даёт SER_INVALID_HANDLE (RTL возвращал 0
  под Windows и −1 под Unix, из-за чего вызывающие держали свои развилки).
  Проверка — SerValid.

Точки вызова: CATSerial и CWKeyer переведены на обёртку, заглушка
CAT_SERIAL_STUB и платформенные {$IFDEF} вокруг хендлов убраны. Имена портов по
умолчанию и подсказка в настройках теперь платформенные (SerDefaultPortName /
SerPortNameHint): на маке порт зовётся /dev/cu.usbserial-XXXX, и '/dev/ttyS0'
там — заведомо неверная подсказка; осмысленного умолчания не существует,
поэтому пусто.

Новый стенд test/serial (36 проверок) — на псевдотерминале: открытие, termios
обратным чтением, ★«CRTSCTS сам не включился», ★«в c_cflag нет ничего, кроме
наших флагов», формат через чистую SerCFlags (обратным чтением его не
проверить: pty восьмибитно-чистый и молча меняет CS7 на CS8), обмен, срок
таймаута, CR не превращается в CR+LF, эха нет, и сквозной прогон CAT через
обёртку. Негативный контроль: с `or Cardinal(BitsPerSec)` в SerSetParams (та
самая идиома, что ломает RTL на BSD) проверка c_cflag падает — «1CAB0 против
8B0».

test/platform расширен: теперь сим-компилирует и SerialPort, для его
Windows-ветки добавлена заглушка модуля Serial с теми же сигнатурами.

Модемные линии (DTR/RTS/CTS/DSR/CD/RI) на pty не проверяются — ioctl TIOCM*
там не работает; это остаётся на живой порт.

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

41 lines
2.9 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` (а не ноль и не
случайное число), живой — годный хендл.
* **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`.