ShineLAN-X: USB-CDC Modbus vorbereitet, Modbus vorläufig deaktiviert

- Wechselrichter-Kommunikation läuft über USB-CDC (PA11=D-, PA12=D+, PA8=Pullup)
- Modbus-Platzhalter bis USB-Port wieder eingelötet und getestet
- USB-CDC build flags entfernt (blockieren ohne Host), werden separat aktiviert
- Ethernet + MQTT läuft stabil (DHCP, HA Discovery)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
retr0
2026-04-17 05:49:39 +02:00
parent 054f8c3fa6
commit 942e6b4e4d
2 changed files with 14 additions and 32 deletions
+6 -9
View File
@@ -50,16 +50,13 @@
#define MQTT_CLIENT "growatt-shinelan" #define MQTT_CLIENT "growatt-shinelan"
// ============================================================ // ============================================================
// MODBUS / WECHSELRICHTER-UART // MODBUS / WECHSELRICHTER-KOMMUNIKATION
// Growatt kommuniziert über USB-CDC (virtueller COM-Port) bei 115200 Baud // Growatt kommuniziert über USB-CDC (virtueller COM-Port) bei 115200 Baud.
// kein klassisches RS485, kein DE/RE-Pin nötig. // STM32 agiert als USB-Device (CDC), Wechselrichter ist USB-Host.
// Bestätigt durch ESPHome-Configs (tx=1, rx=3, baud=115200, kein flow_control_pin). // Physikalisch: PA11=D-, PA12=D+, PA8=USB-Pullup-Steuerpin
// Kandidat für STM32: USART3 (PB10=TX, PB11=RX) — auf Platine nachmessen! // Kein RS485, kein DE/RE-Pin nötig.
// PA3 = Taster → USART2 (PA2/PA3) scheidet aus.
// ============================================================ // ============================================================
#define MODBUS_TX_PIN PB10 // USART3 TX — TODO: auf Platine bestätigen #define MODBUS_BAUD 115200 // Growatt USB-CDC Baudrate
#define MODBUS_RX_PIN PB11 // USART3 RX — TODO: auf Platine bestätigen
#define MODBUS_BAUD 115200 // Growatt USB-CDC Baudrate (nicht 9600 RS485!)
#define MODBUS_ADDR 1 // Modbus Slave-Adresse des Wechselrichters #define MODBUS_ADDR 1 // Modbus Slave-Adresse des Wechselrichters
// ============================================================ // ============================================================
+8 -23
View File
@@ -8,8 +8,7 @@
// Debug-UART: USART1 TX=PA9, RX=PA10 // Debug-UART: USART1 TX=PA9, RX=PA10
HardwareSerial DebugSerial(PA10, PA9); HardwareSerial DebugSerial(PA10, PA9);
// Modbus-UART: USART3 TX=PB10, RX=PB11 (Growatt USB-CDC bei 115200 Baud) // Modbus über USB-CDC (SerialUSB = PA11/PA12, Wechselrichter ist USB-Host)
HardwareSerial ModbusSerial(MODBUS_RX_PIN, MODBUS_TX_PIN);
// ============================================================ // ============================================================
// Sensor-Definition // Sensor-Definition
@@ -187,9 +186,9 @@ void setup() {
mqtt.setServer(MQTT_BROKER, MQTT_PORT); mqtt.setServer(MQTT_BROKER, MQTT_PORT);
mqtt.setBufferSize(768); mqtt.setBufferSize(768);
// Modbus UART // Modbus: USB-CDC (PA11/PA12) — wird aktiviert sobald Wechselrichter angeschlossen
ModbusSerial.begin(MODBUS_BAUD); // SerialUSB.begin(MODBUS_BAUD);
modbus.begin(MODBUS_ADDR, ModbusSerial); // modbus.begin(MODBUS_ADDR, SerialUSB);
DebugSerial.println("Setup done."); DebugSerial.println("Setup done.");
} }
@@ -222,24 +221,10 @@ void loop() {
uint8_t result; uint8_t result;
uint32_t raw = 0; uint32_t raw = 0;
if (s.isDword) { // TODO: Modbus aktivieren sobald USB-CDC (Wechselrichter) angeschlossen
result = modbus.readInputRegisters(s.address - 1, 2); result = ModbusMaster::ku8MBSuccess; // Platzhalter
if (result == ModbusMaster::ku8MBSuccess) raw = 0;
raw = ((uint32_t)modbus.getResponseBuffer(0) << 16) (void)result;
| modbus.getResponseBuffer(1);
} else {
result = modbus.readInputRegisters(s.address - 1, 1);
if (result == ModbusMaster::ku8MBSuccess)
raw = modbus.getResponseBuffer(0);
}
if (result != ModbusMaster::ku8MBSuccess) {
DebugSerial.print("Modbus ERR ");
DebugSerial.print(s.id);
DebugSerial.print(" rc=");
DebugSerial.println(result, HEX);
continue;
}
float value = raw * s.scale; float value = raw * s.scale;
dtostrf(value, 1, (s.scale < 0.1f) ? 2 : 1, valueStr); dtostrf(value, 1, (s.scale < 0.1f) ? 2 : 1, valueStr);