test fix for dropping points

This commit is contained in:
awe
2026-01-29 16:58:01 +03:00
parent 42d4400c99
commit 23cff76dd2

View File

@ -92,6 +92,14 @@ def try_open_pyserial(path: str, baud: int, timeout: float):
return None
try:
ser = serial.Serial(path, baudrate=baud, timeout=timeout)
# Включаем hardware flow control для предотвращения потери данных
ser.rtscts = True
# Увеличиваем буфер приема ядра до 64KB
try:
ser.set_buffer_size(rx_size=65536, tx_size=4096)
except (AttributeError, NotImplementedError):
# Не все платформы/версии pyserial поддерживают set_buffer_size
pass
return ser
except Exception:
return None
@ -105,7 +113,8 @@ class FDReader:
self._fd = fd
raw = os.fdopen(fd, "rb", closefd=False)
self._file = raw
self._buf = io.BufferedReader(raw, buffer_size=65536)
# Увеличен размер буфера до 256KB для предотвращения потерь
self._buf = io.BufferedReader(raw, buffer_size=262144)
def fileno(self) -> int:
return self._fd
@ -286,6 +295,8 @@ class SweepReader(threading.Thread):
self._sweep_idx: int = 0
self._last_sweep_ts: Optional[float] = None
self._n_valid_hist = deque()
# Счетчик потерь данных (выброшенных свипов из-за переполнения очереди)
self._dropped_sweeps: int = 0
def _finalize_current(self, xs, ys):
if not xs:
@ -369,12 +380,15 @@ class SweepReader(threading.Thread):
"mean": mean,
"std": std,
"dt_ms": dt_ms,
"dropped": self._dropped_sweeps,
}
# Кладём готовый свип (если очередь полна — выбрасываем самый старый)
try:
self._q.put_nowait((sweep, info))
except Full:
# Счетчик потерь для диагностики
self._dropped_sweeps += 1
try:
_ = self._q.get_nowait()
except Exception:
@ -405,8 +419,8 @@ class SweepReader(threading.Thread):
if data:
buf += data
else:
# Короткая уступка CPU, если нет новых данных
time.sleep(0.0005)
# Короткая уступка CPU, если нет новых данных (уменьшена до 0.1ms)
time.sleep(0.0001)
continue
# Обрабатываем все полные строки
@ -439,9 +453,9 @@ class SweepReader(threading.Thread):
xs.append(x)
ys.append(y)
# Защита от переполнения буфера при отсутствии переводов строки
if len(buf) > 1_000_000:
del buf[:-262144]
# Защита от переполнения буфера при отсутствии переводов строки (снижен порог)
if len(buf) > 262144:
del buf[:-131072]
finally:
try:
# Завершаем оставшийся свип