From 6c775ee6b8f94a80aaceed03b000f6c6319f5d52 Mon Sep 17 00:00:00 2001 From: me Date: Sat, 23 May 2026 19:42:08 -0700 Subject: [PATCH] fix: remove flush() in _write_frame to prevent hang on USB CDC ACM serial.flush() calls termios.tcdrain() under the hood, which blocks indefinitely on USB CDC ACM devices (e.g. ESP32 T3S3/S3 with TinyUSB) on Linux. Confirmed on Linux Mint + T3S3 + MeshCore KISS Modem v1.15.0. pyserial's write() already copies data into the kernel USB buffer atomically, so no explicit drain is needed. --- src/pymc_core/hardware/kiss_modem_wrapper.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/pymc_core/hardware/kiss_modem_wrapper.py b/src/pymc_core/hardware/kiss_modem_wrapper.py index 17180c1..8240995 100644 --- a/src/pymc_core/hardware/kiss_modem_wrapper.py +++ b/src/pymc_core/hardware/kiss_modem_wrapper.py @@ -456,11 +456,9 @@ def _write_frame(self, frame: bytes) -> bool: except Exception as e: logger.error("Serial write error: %s", e) return False - try: - self.serial_conn.flush() - except Exception as e: - logger.error("Serial flush error: %s", e) - return False + # flush()/tcdrain() removed: hangs indefinitely on USB CDC ACM + # (e.g. ESP32 T3S3/S3 with TinyUSB). write() already copies data + # to the kernel USB buffer atomically; no drain needed. return True def _set_kiss_tx_delay(self, delay_ms: int) -> None: