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