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"
// ============================================================
// MODBUS / WECHSELRICHTER-UART
// Growatt kommuniziert über USB-CDC (virtueller COM-Port) bei 115200 Baud
// kein klassisches RS485, kein DE/RE-Pin nötig.
// Bestätigt durch ESPHome-Configs (tx=1, rx=3, baud=115200, kein flow_control_pin).
// Kandidat für STM32: USART3 (PB10=TX, PB11=RX) — auf Platine nachmessen!
// PA3 = Taster → USART2 (PA2/PA3) scheidet aus.
// MODBUS / WECHSELRICHTER-KOMMUNIKATION
// Growatt kommuniziert über USB-CDC (virtueller COM-Port) bei 115200 Baud.
// STM32 agiert als USB-Device (CDC), Wechselrichter ist USB-Host.
// Physikalisch: PA11=D-, PA12=D+, PA8=USB-Pullup-Steuerpin
// Kein RS485, kein DE/RE-Pin nötig.
// ============================================================
#define MODBUS_TX_PIN PB10 // USART3 TX — TODO: auf Platine bestätigen
#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_BAUD 115200 // Growatt USB-CDC Baudrate
#define MODBUS_ADDR 1 // Modbus Slave-Adresse des Wechselrichters
// ============================================================
+8 -23
View File
@@ -8,8 +8,7 @@
// Debug-UART: USART1 TX=PA9, RX=PA10
HardwareSerial DebugSerial(PA10, PA9);
// Modbus-UART: USART3 TX=PB10, RX=PB11 (Growatt USB-CDC bei 115200 Baud)
HardwareSerial ModbusSerial(MODBUS_RX_PIN, MODBUS_TX_PIN);
// Modbus über USB-CDC (SerialUSB = PA11/PA12, Wechselrichter ist USB-Host)
// ============================================================
// Sensor-Definition
@@ -187,9 +186,9 @@ void setup() {
mqtt.setServer(MQTT_BROKER, MQTT_PORT);
mqtt.setBufferSize(768);
// Modbus UART
ModbusSerial.begin(MODBUS_BAUD);
modbus.begin(MODBUS_ADDR, ModbusSerial);
// Modbus: USB-CDC (PA11/PA12) — wird aktiviert sobald Wechselrichter angeschlossen
// SerialUSB.begin(MODBUS_BAUD);
// modbus.begin(MODBUS_ADDR, SerialUSB);
DebugSerial.println("Setup done.");
}
@@ -222,24 +221,10 @@ void loop() {
uint8_t result;
uint32_t raw = 0;
if (s.isDword) {
result = modbus.readInputRegisters(s.address - 1, 2);
if (result == ModbusMaster::ku8MBSuccess)
raw = ((uint32_t)modbus.getResponseBuffer(0) << 16)
| 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;
}
// TODO: Modbus aktivieren sobald USB-CDC (Wechselrichter) angeschlossen
result = ModbusMaster::ku8MBSuccess; // Platzhalter
raw = 0;
(void)result;
float value = raw * s.scale;
dtostrf(value, 1, (s.scale < 0.1f) ? 2 : 1, valueStr);