SML Protokoll identifiziren und zerlegen

Na wenn das schon Erleuchtung brachte, hab ich alles richtig gemacht :slight_smile:

Wenn Du mal einen Satz fĂŒr mich hast, kannst ihn ja mal vorbei schicken. Wie, solltest Du ja noch zusammen bekommen. Ich sammel fĂŒr spĂ€tere Tests schon mal ein. Die ID kann ja verĂ€ndert werden - wo sie drin ist, weisst ja jetzt...

Nachtrag: Dein ZĂ€hler kann eine erweiterte Nachricht auf Anforderung versenden. Ich wĂŒrde die gerne mal sehen wollen. (Ab Beschreibung des ZĂ€hlers Seite 15 - INFO-Anzeige Abbildung 6)

Kann man das irgendwo nachlesen welche das sind?

Schau mal bei ESP32 Pinout Reference: Which GPIO pins should you use?, da gibt es eine informative Liste.

grafik

Zu Deiner Hardware könnte, wenn ich es auf Deinem Foto richtig erkenne, diese Pinanordnung (Quelle) passen:

Ja? Nein?


"Liste" hatte ich nicht verstanden, jetzt leuchtet es :bulb:

1 Like

3 definitiv, 5, 14 und 15, wenn Du Pech hast (PWM-Signal wÀhrend des Bootens)

1 Like

Oh man, da hast du die 15 mit aufgelistet, ... das wird scheinbar das Problem sein.

Das schaut so aus wie das was ich hier auf dem Schreibtisch liegen habe.
GPIO[16 & 17] und [1 & 3] sollten beim Flaschen unberĂŒhrt bleiben.
Wobei 3 von @Miq1 aufgelistet ist das dieser ein Signal wÀhrend des Bootens bekommt.

[EDIT] dann gehe ich von aus das ich mir meinen IR-Transistor geschrotet habe.
Ich bestelle jetzt ein 50er pack.

Angenommen der interne Puffer (FIFO) ist also zu klein, d.h. er wĂ€re beispielsweise 64 Byte gross, aber vor der nĂ€chsten Abfrage (available) sind schon 70 Zeichen angekommen... wie kann ich den Puffer vergrĂ¶ĂŸern?

genau das ist das was mich bei den gesamten ESP32 so extrem verunsichert, stÀndig wird ein anders PIN-OUT dargestellt und ich bin mir nicht sicher ob es dann das Bord ist was ich nun habe oder nicht.

das PIN-OUT auf der Seite mit dem Link:


PIN-OUT bei mir auf dem Schreibtisch:

Garnicht, wenn Du die Hardwareschnittstellen benutzt. Wie soll das gehen?

Alternatuv kannst Du softwareserial benutzen.
Dort kannst Du den Puffer manuell anpassen.
Aber wem die z.B. 32 bytes nicht reichen, hat ein viel grĂ¶ĂŸeres Problem.
Hinweis: Das ist ein reiner Übertragungspuffer. Du kannst mit den Daten nichts anfangen, solange die da drin sind. Siehe fĂŒr den ESP die Doku zum Aufbau UART: https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf#uart

Der ESP32 ist das quadratische silberne KĂ€stchen.

Die Platine drumrum ist das Test-Board, das jeder Hersteller nach eigenen Vorstellungen gestaltet. Soviele Hersteller es gibt, so viele Varianten existieren. GPIO6 bis GPIO11 hĂ€ngen am Flash-Speicher und sind extern nicht nutzbar und daher bei Deinem Board nicht rausgefĂŒhrt.

Nutze die fĂŒr Dich relevante Pinbelegung!

Aber: Serial1 liegt auf den Flash-Pins und wird bei Deinem Board-Pinout nicht berĂŒcksichtigt, ist aber auch bei Deinem ESP32 durchaus vorhanden. Da der ESP32 eine Pin-Matrix verwendet, kannst Du bei der Einrichtung von Serial1 RXD1 und TXD1 auf andere Pins verlegen. Bei meinem Bord ist Serial1 sichtbar:

Leider zeigen nicht alle Pinouts auch alle möglichen Pins und deren Bedeutung.

1 Like

Wieso nicht?
Da es in diesem Thread um den ESP32 geht, gibt es dafĂŒr sogar Methoden
HardwareSerial.h Zeile 168/169.

Gruß Tommy

2 Likes

AAh.. DANKE!

Bannen die dann die GPIO alle gleich?

Ok, nach der Liese auf der Seite Quelle
WĂŒrde dann wie von dir vorgeschlagen

Bei den neuen IR-Transistor umstellen.

Nö, das wÀre ja zu einfach. Das liegt an der Auswahl des Boards in der Arduino-IDE. Du brauchst so wie ich "ESP32 Dev Module". Ich habe alle anderen in der IDE ausgeblendet.

Ich verwende ebenso gerne Serial2:

// Serielle Schnittstelle
#define Baudrate 9600                   // vorgabe vom StromzÀhler
#define Protocol SERIAL_8N1             // vorgabe vom StromzÀhler
...
  Serial2.begin(Baudrate, Protocol);  // RXD2 = GPIO16
1 Like

Nochmal nachgetragen:
Die Hardwareschnittstelle (UART) hat einen Puffer von genau 1 Byte. Die Interrupt-Routine hat also 1 Zeichen lang Zeit, dieses Byte in einen beliebig großen Software-Puffer (der bei Arduino traditionell 64 byte groß ist) umzukopieren. In diesem Puffer wird gnadenlos und ohne Fehlerkennzeichnung das Ă€lteste ĂŒberschrieben. read() liest aus diesem Software-Puffer jeweils das Ă€lteste noch vorhandene aber nicht gelesene Byte aus.

1 Like

Also mit
Serial.setRxBufferSize(128)
könnte man recht einfach mal den Empfangspuffer auf 128 Byte setzen?
WĂ€re doch einen Versuch wert....

Jupp.
Ich bin fÀlschlich davon ausgegangen, das der ESP ebenfalls einen USART hat. Da steckt aber RAM hinter, der konfigurierbar ist. Nach dem lesen war ich dann auch schlauer. :flushed:

Ein Versuch ja. Ich versteh blos noch immer nicht warum man das machen mĂŒsste.
Wenn Du mit weniger nicht auskommst, weil Du langsamer ein byte abholst, als zwei Byte kommen, dann kommt auch der 128Byte-Speicherplatz irgendwann an seine Grenzen und Du stehst vor genau dem selben Problem.
Hier hilft Dir dann - vollkommen ausserhalb der Spezifikation - vermutlich eher die Sendepause zwischen zwei Nachrichten um den Puffer leer zu lesen.

Angenommen, das Problem taucht nicht bei jedem Durchgang, sondern erst alle 10 DurchgÀnge auf, dann könnte man einfach einen Durchgang auslassen, den Puffer komplett auslesen und die Bearbeitung (die zu lange dauert) verwerfen und hÀtte anschliessend wieder genug Zeit um 9 Datenpakete korrekt zu verarbeiten.
Besser als immer wieder unvollstÀndige Daten zu verarbeiten und dann eine Anfang/Ende Sequenz nicht zu erkennen, den Puffer aber mit den (unnötigen) empfangenen daten noch voll zu haben.

Das kÀme dann wieder an dem Punkt raus, das Du eine Schleife brauchst, die die 128 Bytes ausliest, bis nichts mehr drin ist.
Dann kann ich auch von vornherein while() nehmen und spare mir die Konstruktionen drumrum.
Alternativ kann ich mit

byte x=Serial1.available();
for (byte b=0; b<x b++)

sowas bauen. :innocent:

1 Like

Da die ESP32 haben mehrere Modulvarianten, wichtig ist GPIO 6 bis 11 sind Tabu == interne Verbindung zum Speicher.
GPIO 34,35, 36 und 39 nur als Eingang. Such dir Pinbelegung fĂŒr dein ESP und drucke aus :wink:

Ich schwanke noch zwischen direkter Verarbeitung und erst zwischenspeichern und dann auswerten. Meine DatensĂ€tze sind ĂŒber 600 Byte lang.

Funktioniert serialEvent() beim ESP32, dann könnte man per Interrupt einen (Ring-)Puffer vollschreiben und die Pause zur Auswertung nutzen.

1 Like