From 23cff76dd263808d9d4b08517dbc866492adb7ab Mon Sep 17 00:00:00 2001 From: awe Date: Thu, 29 Jan 2026 16:58:01 +0300 Subject: [PATCH] test fix for dropping points --- RFG_ADC_dataplotter.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/RFG_ADC_dataplotter.py b/RFG_ADC_dataplotter.py index 3a4c964..ade3d22 100755 --- a/RFG_ADC_dataplotter.py +++ b/RFG_ADC_dataplotter.py @@ -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: # Завершаем оставшийся свип