test fix for dropping points
This commit is contained in:
@ -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:
|
||||||
# Завершаем оставшийся свип
|
# Завершаем оставшийся свип
|
||||||
|
|||||||
Reference in New Issue
Block a user