Seltsames Phänomen bei serieller Übertr. ESP8266 - MBus 2. Versuch

Gast #7456192
Lesenswert?

Schönen Nachmittag

Ich versuche meinen Kaifa-Zähler (EVN) über den MBus auszulesen. Den zugehörigen Schlüssel hat mir der Netzbetreiber zugeschickt und ich habe ihn mit diesem Sketch https://github.com/micronano0/ESP8266-NodeMCU-KAIFA-SmartMeter-Reader-STV- auf einem ESP8266 D1 mini verwendet. (Aufbau Bild 1)

Ergebnis: Keine Daten.

Dann habe ich den Sketch auf die reine serielle Übertragung zusammengestutzt und gebe das Ergebnis auf einem kleinen Display aus:

1
#include <Adafruit_SSD1306.h>
2

3
#define SCREEN_WIDTH 128 // OLED display width, in pixels
4
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
5
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
6
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
7

8
byte incomingByte = 0; // for incoming serial data
9

10
void setup() {
11
  Serial.begin(2400, SERIAL_8E1); // opens serial port, 
12
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
13
  display.clearDisplay();
14
  display.setTextSize(1);      // Normal 1:1 pixel scale
15
  display.setTextColor(WHITE); // Draw white text
16
  display.setCursor(0, 0);
17
  display.println("Kaifa: ");
18
  display.display();
19
  delay(300);
20
}
21

22
void loop() {
23
  // send data only when you receive data:
24
  if (Serial.available() > 0) {
25
    // read the incoming byte:
26
    incomingByte = Serial.read();
27

28
    // say what you got:
29
    //Serial.print("I received: ");
30
    //Serial.println(incomingByte, HEX);
31
  display.print(incomingByte, HEX);
32
  display.print(" ");
33
  display.display();
34
  }
35
}

Der Zähler sendet alle 5 sek. ein Paket von 482Byte mit 2400E81.

Beim ESP kommen davon nur zweimal 68 FF (mit einer kurzen Pause) davon an.

Schließe ich einen RS232-Adapter an den MBusAdapter an (Bild 2) und lassen den PC (mit HTerm) empfangen, bekomme ich die gesamten Daten. (Bild 3)

Schließe ich den RS232-Adapter an den ESP an und sende die (vorher vom Zähler empfangene) Datei vom PC zum ESP8266, kommt auch alles an.

Nur vom Zähler direkt zum ESP bleiben nur die besagten 4 Byte übrig ... :(

Hat wer eine Idee? Danke fürs Lesen Christian

Angehängte Dateien:
Gast #7456198
Lesenswert?

Ich sehe, dass du innerhalb der Verarbeitungs-Schleife

1
if (Serial.available() > 0) {
2
   incomingByte = Serial.read();
3
   ...
4
}

Ausgaben auf das Display machst. Diese brauchen signifikant Zeit, deswegen brauchst du einen Puffer am seriellen Port. Vermutlich ist der vorhanden, aber ist er auch groß genug?

Ändere den Code mal so dass display.display() verzögert aufgerufen wird. Und zwar nachdem alle Bytes verarbeitet wurden, also Serial.available() == 0 ist.

Gast #7456207
Lesenswert?

Leider keine Besserung

1
#include <Adafruit_SSD1306.h>
2

3
#define SCREEN_WIDTH 128 // OLED display width, in pixels
4
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
5
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
6
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
7

8
byte incomingByte = 0; // for incoming serial data
9

10
void setup() {
11
  Serial.begin(2400, SERIAL_8E1); // opens serial port, 
12
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
13
  display.clearDisplay();
14
  display.setTextSize(1);      // Normal 1:1 pixel scale
15
  display.setTextColor(WHITE); // Draw white text
16
  display.setCursor(0, 0);
17
  display.println("Kaifa: ");
18
  display.display();
19
  delay(300);
20
}
21

22
void loop() {
23
  // send data only when you receive data:
24
  if (Serial.available() > 0)
25
  {
26
    // read the incoming byte:
27
    incomingByte = Serial.read();
28

29
   display.print(incomingByte, HEX);
30
   display.print(" ");
31
  }
32
  else
33
  {
34
  display.display();    
35
  }
36
}
Gast #7456227
Lesenswert?

Ich fürchte, ich verstehe nicht was Du meinst.

TX (vom MBus-Board) und RX (vom ESP) sind verbunden, somit (erwartbare) 0.000V

Und da der Zähler nur sendet ist die Gegenrichtung nicht verbunden.

Oder was meintest Du?

Moderator (Firma: Titel) Persönliche Seite #7456231
Lesenswert?

Hast du ein Oszilloskop, um mal zu kontrollieren, was sich denn dort real auf der RX-Leitung des µC abspielt?

Denn ohne ein solches Messgerät wirst du bei seriellen Bussen laufend im Blindflug mit Herumbastlen die Fehler suchen müssen. Dort im Beitrag "Re: UART Übertragungsfehler bei bestimmten Zahlenwerten" sind solche Fälle verlinkt.

Christian B. schrieb:

Ich fürchte, ich verstehe nicht was Du meinst.

Ein Schaltplan wäre nicht schlecht. Denn mit Fotos vom Aufbau muss man erst noch die Module und deren Pinbelegung herauskramen und sich in Gedanken diesen Schaltplan aufmalen. Das tue ich mir ehrlich gesagt nicht an. An einem Schaltplan sieht man fundamentale Designflaws auf einen Blick...

Gast #7456251
Lesenswert?

Christian B. schrieb:

TX (vom MBus-Board) und RX (vom ESP) sind verbunden, somit (erwartbare) 0.000V

Eben nicht. UART Rx und Tx Leitungen müssen im Ruhezustand auf HIGH Pegel sein, also idealerweise 3,3 Volt. Alles was davon abweicht könnte ein Hinweis auf die Fehlerursache sein.

Christian B. schrieb:

Der Pegel zwischen den Datenpaketen ist 3V3 (das wolltest Du, Stefan, vermutlich wissen)

Genau. Der HIGH Pegel sieht plausibel aus, aber der LOW Pegel ist mit seinen >2 Volt viel zu hoch. Da würde ich weniger als 0,5 Volt erwarten.

Gast #7456257
Lesenswert?

Stefan F. schrieb:

Genau. Der HIGH Pegel sieht plausibel aus, aber der LOW Pegel ist mit seinen >2 Volt viel zu hoch. Da würde ich weniger als 0,5 Volt erwarten.

Du wirst sicher recht haben. Fragt sich nur, warum dann reproduzierbar immer "68 FF" kommt, und der ganze Rest nicht ...

Gast #7456258
Lesenswert?

Kontrolliere, ob die Stromversorgungs-Schienen des Steckbrettes an den markierten Stellen unterbrochen sind. Das ist bei einigen Steckbrettern der Fall.

Wenn sie bei dir unterbrochen sind, dann fehlt bei dir eine GND Verbindung, was die Ursache für die falschen LOW Pegel sein könnte.

Angehängte Dateien:
Gast #7456272
Lesenswert?

Sobald ich vom ESP den RX abstecke geht der Pegel am Mbus-Board beim Senden fast auf 0.

Wahrscheinlich muss ich erst den RX als Eingang definieren? (Hätte gedacht, das ist er per default ...)

Gast #7456310
Lesenswert?

Das klingt sehr plausibel und erklärt eigentlich auch die Reproduzierbarkeit. Zu Beginn des Datenpaketes gehen die Signalspitzen ein wenig weiter Richtung 0V und steigen dann rasch an.

Das werden die ersten beiden Byte sein, die gerade noch so durchkommen. Dann ist Sense.

Vielen Dank für eure Hilfe Christian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren