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
|
||||
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:
|
||||
# Завершаем оставшийся свип
|
||||
|
||||
Reference in New Issue
Block a user