Auto-detect upload port faalt bij client door serial log output #16

Closed
opened 2026-08-04 11:10:09 +02:00 by eddy · 1 comment
Owner

Probleem

De post-script tools/pio_upload_port.py stuurt ID? naar de ESP en leest het eerste non-empty antwoord om te bepalen of de device server of client is. De client reageert correct met SylDa_Client (client.cpp:704-705), maar tijdens de upload was er actieve log output (ECDH handshake) op de seriele poort, waardoor query_id() het eerste log-bericht las in plaats van de ID response — met als gevolg dat de auto-detect faalde:

Cannot auto-detect SylDa_Client (no ID? response matched)
Available ESP32 ports:
  1: ... (SylDa_Server)
  2: ... ([145389][I][client.cpp:321] performEcdhHandshake(): ...)

Oorzaak

query_id() (tools/pio_upload_port.py:46-61) leest de eerste non-empty regel na ID?, ook als die regel log output is:

def query_id(port, timeout=5):
    ser = serial.Serial(port, 115200, timeout=0.5)
    time.sleep(0.1)
    ser.reset_input_buffer()
    ser.write(b"ID?\n")
    deadline = time.time() + timeout
    while time.time() < deadline:
        line = ser.readline().decode("utf-8", errors="ignore").strip()
        if line:
            ser.close()
            return line  # <-- Pakt eerste non-empty regel, ook als het log is
    ser.close()
    return None

Mogelijke oplossingen

  1. Script-side fix (voorkeur): Laat query_id() meerdere regels lezen en matchen tegen expected_id in plaats van blind de eerste regel te pakken:

    while time.time() < deadline:
        line = ser.readline().decode("utf-8", errors="ignore").strip()
        if line and expected_id in line:
            ser.close()
            return line
    
  2. Firmware-side: De client kan serial log output pauzeren/flushen vóór het beantwoorden van ID?.

  3. Fallback op VERSION?: query_id kan als fallback VERSION?/BUILD_NR:XX gebruiken — het buildnummer bevat weliswaar niet SylDa_Client, maar de port detectie kan ook via process of elimination (2 poorten, 1 server, dan is de andere de client).

Reproductie

  1. Sluit server én client tegelijk aan op USB
  2. De client draait in normale modus (logt periodiek)
  3. pio run -e s3lite-client -t upload — auto-detect faalt

Workaround

Handmatig --upload-port gebruiken:

pio run -e s3lite-client -t upload --upload-port /dev/serial/by-id/usb-Espressif_...
## Probleem De post-script `tools/pio_upload_port.py` stuurt `ID?` naar de ESP en leest het eerste non-empty antwoord om te bepalen of de device server of client is. De client reageert correct met `SylDa_Client` (client.cpp:704-705), maar tijdens de upload was er actieve log output (ECDH handshake) op de seriele poort, waardoor `query_id()` het eerste log-bericht las in plaats van de ID response — met als gevolg dat de auto-detect faalde: ``` Cannot auto-detect SylDa_Client (no ID? response matched) Available ESP32 ports: 1: ... (SylDa_Server) 2: ... ([145389][I][client.cpp:321] performEcdhHandshake(): ...) ``` ## Oorzaak `query_id()` (`tools/pio_upload_port.py:46-61`) leest de eerste non-empty regel na `ID?`, ook als die regel log output is: ```python def query_id(port, timeout=5): ser = serial.Serial(port, 115200, timeout=0.5) time.sleep(0.1) ser.reset_input_buffer() ser.write(b"ID?\n") deadline = time.time() + timeout while time.time() < deadline: line = ser.readline().decode("utf-8", errors="ignore").strip() if line: ser.close() return line # <-- Pakt eerste non-empty regel, ook als het log is ser.close() return None ``` ## Mogelijke oplossingen 1. **Script-side fix (voorkeur):** Laat `query_id()` meerdere regels lezen en matchen tegen `expected_id` in plaats van blind de eerste regel te pakken: ```python while time.time() < deadline: line = ser.readline().decode("utf-8", errors="ignore").strip() if line and expected_id in line: ser.close() return line ``` 2. **Firmware-side:** De client kan serial log output pauzeren/flushen vóór het beantwoorden van `ID?`. 3. **Fallback op `VERSION?`:** `query_id` kan als fallback `VERSION?`/`BUILD_NR:XX` gebruiken — het buildnummer bevat weliswaar niet `SylDa_Client`, maar de port detectie kan ook via process of elimination (2 poorten, 1 server, dan is de andere de client). ## Reproductie 1. Sluit server én client tegelijk aan op USB 2. De client draait in normale modus (logt periodiek) 3. `pio run -e s3lite-client -t upload` — auto-detect faalt ## Workaround Handmatig `--upload-port` gebruiken: ```bash pio run -e s3lite-client -t upload --upload-port /dev/serial/by-id/usb-Espressif_... ```
Author
Owner

Fixed by PR #24 — serial mute during ID? response + script-side filtering.

Fixed by PR #24 — serial mute during ID? response + script-side filtering.
eddy closed this issue 2026-08-04 20:36:36 +02:00
Sign in to join this conversation.
No description provided.