From 4d2da56baf25241d5217135a699c90352ee50a59 Mon Sep 17 00:00:00 2001 From: retr0 <42kdesigners@gmail.com> Date: Mon, 20 Apr 2026 19:10:57 +0200 Subject: [PATCH] ShineLAN-X: USB PID-Fix + Modbus-Diagnose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit USB PID auf 0x5740 (STM32 Virtual COM Port) gesetzt — Wechselrichter akzeptiert nur diesen PID und pollt den IN-Endpoint sonst nicht. Product-String ebenfalls auf Originalwert gesetzt. MODBUS_BAUD auf 9600 (Growatt-Standard, baud-rate ist bei USB CDC virtuell aber beeinflusst CDC Line Coding). usbReady-Check von == 127 auf >= 8 gelockert — verhindert dass ein voller TX-Buffer alle Sensoren sofort mit 0xFE abwürgt. Debug-String zeigt jetzt avS (Zyklusstart) und avE (Zyklusende) zur Diagnose des TX-Buffer-Verlaufs. Co-Authored-By: Claude Sonnet 4.6 --- ShineLAN-X/firmware/include/config.h | 2 +- ShineLAN-X/firmware/platformio.ini | 2 ++ ShineLAN-X/firmware/src/main.cpp | 7 ++++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ShineLAN-X/firmware/include/config.h b/ShineLAN-X/firmware/include/config.h index 4bce396..255c265 100644 --- a/ShineLAN-X/firmware/include/config.h +++ b/ShineLAN-X/firmware/include/config.h @@ -27,7 +27,7 @@ // ============================================================ // MODBUS // ============================================================ -#define MODBUS_BAUD 115200 +#define MODBUS_BAUD 9600 #define MODBUS_ADDR 1 // ============================================================ diff --git a/ShineLAN-X/firmware/platformio.ini b/ShineLAN-X/firmware/platformio.ini index 0ed2786..826935a 100644 --- a/ShineLAN-X/firmware/platformio.ini +++ b/ShineLAN-X/firmware/platformio.ini @@ -17,4 +17,6 @@ build_flags = -DUSBD_USE_CDC -DHAL_PCD_MODULE_ENABLED -DUSB_CDC_TRANSMIT_TIMEOUT=3000 + -DCUSTOM_USBD_PID=0x5740 + '-DUSB_PRODUCT_STRING="STM32 Virtual COM Port"' -I include diff --git a/ShineLAN-X/firmware/src/main.cpp b/ShineLAN-X/firmware/src/main.cpp index fb94978..6741c10 100644 --- a/ShineLAN-X/firmware/src/main.cpp +++ b/ShineLAN-X/firmware/src/main.cpp @@ -551,7 +551,8 @@ void loop() { ledSet(LED_BLUE, true); - bool usbReady = (SerialUSB.availableForWrite() == 127); + uint8_t avStart = SerialUSB.availableForWrite(); + bool usbReady = (avStart >= 8); uint8_t okCount = 0, failCount = 0; uint8_t lastErr = 0; uint16_t lastErrReg = 0; @@ -600,9 +601,9 @@ void loop() { if (lastErr) g_lastErr = lastErr; char dbg[64]; - snprintf(dbg, sizeof(dbg), "ok=%u fail=%u err=0x%02X@%u av=%d rx=%d", + snprintf(dbg, sizeof(dbg), "ok=%u fail=%u err=0x%02X@%u avS=%d avE=%d rx=%d", okCount, failCount, lastErr, lastErrReg, - SerialUSB.availableForWrite(), SerialUSB.available()); + avStart, SerialUSB.availableForWrite(), SerialUSB.available()); mqtt.publish("growatt/shinelan/debug", dbg); ledSet(LED_BLUE, false);