На ноутбуке магазина автопоиск спотыкался о Bluetooth-порты (COM7/COM8 — Open/Write
висят), выбирал по умолчанию BT и не доходил до COM22 (USB-SERIAL CH340, где весы).
Парсер/протокол исправны (ручной выбор COM22 57600 работает) — баг только в поиске.
- ScaleAutodiscovery.DiscoverAsync: тирами по типу порта — USB-serial первыми,
неопознанные в середине, Bluetooth последними; на каждый порт ЖЁСТКИЙ таймаут
(Open обёрнут в задачу с гонкой против Task.Delay — SerialPort.Open на BT виснет);
порты перебираются параллельно (до 4), общий бюджет ~15 с; любая ошибка/таймаут →
следующий порт; по каждому порту строка в лог («COM22 CH340: ENQ→ACK, вес 0.000 кг»,
«COM7 Bluetooth: пропущен», «COM15: нет ответа»).
- HardwareProbe: Classify (CH340/Prolific/FTDI/CP210x → USB-serial; BTHENUM/Bluetooth
→ Bluetooth; ttyUSB/ttyACM → USB-serial), ClassifyPorts (без открытия портов),
OpenCloseBounded (жёсткий таймаут — листинг не виснет на BT). ListComPorts не
открывает Bluetooth-порты.
- HwCheck: по умолчанию выбирается НЕ Bluetooth-порт; окно показывает журнал
автопоиска по портам; список портов помечает [USB-serial]/[Bluetooth].
- Основная касса (экран «Оборудование») — та же DiscoverScaleAsync; --probe-hw не
открывает BT-порты.
- Из zip hardware-check убран ярлык «(с тестовой печатью).bat» (печать — отдельно
по слову владельца).
- Тесты: зависающий порт (Open 30 с) не задерживает поиск > таймаута, живой порт
вторым — найден; USB-serial проверяется раньше Bluetooth (BT не трогаем). 53/53.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
По фактическому замеру с ноутбука магазина (11.10): весы Масса-К (USB-COM CH340)
отвечают только на 57600 8N1; рукопожатие ENQ(0x05)→ACK(0x06); запрос DC1(0x11) →
кадр SOH STX «флаг вес единица» CTRL ETX EOT.
- pos.core/Hardware/SerialScale.cs: ISerialTransport (абстракция для тестов) +
SystemSerialTransport (8N1, DTR/RTS), MassaK.ParseFrame/Handshake/ReadFrame/
ReadWeight. Control-байт НЕ валидируем (не подтверждён) — только сырой hex в лог.
Единицы kg по умолчанию, «г/g» → делим на 1000.
- pos.core/Hardware/ScaleDiscovery.cs: SerialScaleReader (+ стабильность по двум
одинаковым чтениям) и ScaleAutodiscovery — 57600 и Масса-К-кадр ПЕРВЫМИ, общий
бюджет, отдельно отмечаем занятые порты («порт занят», а не «весы не найдены»).
- pos: ComScale — тонкий адаптер к pos.core; AppServices хранит scale_proto и по
умолчанию MassaKFrame/57600; ProbeRunner (--probe-hw) печатает сырой hex кадра.
- tests: разбор реального нулевого кадра 01 02 53 20 20 30 2E 30 30 30 6B 67 71 03 04
и вариантов (1.235 / 12.500 / отрицательный / граммы / мусор до SOH / обрезанный /
без ACK) + рукопожатие на фейковом порту. 14/14 зелёных.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>