ShineLAN-X: USB PID-Fix + Modbus-Diagnose

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 <noreply@anthropic.com>
This commit is contained in:
retr0
2026-04-20 19:10:57 +02:00
parent d4e569bce6
commit 4d2da56baf
3 changed files with 7 additions and 4 deletions
+1 -1
View File
@@ -27,7 +27,7 @@
// ============================================================
// MODBUS
// ============================================================
#define MODBUS_BAUD 115200
#define MODBUS_BAUD 9600
#define MODBUS_ADDR 1
// ============================================================
+2
View File
@@ -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
+4 -3
View File
@@ -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);