Man übernimmt die interessanten Daten in Variablen evtl. dazu ein dirty flag ob gerade ein Empfang statt findet
und wenn der CRC richtig ist (der sollte sich ja zur Laufzeit mitrechnen lassen) - dirty wieder auf false setzen.
Oder wenn man es sich vom RAM Verbrauch leisten kann, je eine Variable für "letzter validierter Wert" und "eingegangener Wert - CRC prüfung ausständig". Dann kann man dem Anwender einfach immer die letzten validen Daten im API zurückgeben.
oder überhaupt:
Der Anwender "registriert" die für ihn interessanten OBIS-Codes und nur diese werden daher auch ausgewertet und zur Verfügung gestellt (oder "belegen RAM").
Hallo,
ich denke das ist ein bisschen schwierig, letztlich müsste man dazu erst die Längeangaben einlesen , dann die dazu gehörige Anzahl an bytes in einen kleinen buffer, den dann auswerten also eventuell mehrfach links schieben , und dann weitermachen.
Ich denke es gibt aber auch kaum mehr als 400-500 byte, Im Notfall kann man mit einem Probelesen die Länge ermitteln und dann den Sketch einmal neu durch den Compiler jagen. Wenn das nicht in einen UNO passt, muss halt was anderes her. Aber gehen wird das auch.
Anfänglich war ich auch unsicher, ob ich die Daten gleich beim Einlesen auswerte oder erst nach Speichern in einem Feld. Mit einem ESP32 und damit mehr RAM fällt die Entscheidung für ein Feld natürlich leichter. Meine Argumente:
Wie schon in #402 erwähnt, fällt die Bildung von Werten leichter, weil beim Feld die nächsten n Bytes leicht genutzt werden können, ist nur eine Schleife.
Die CRC-Berechnung des ESP32 erwartet ein Feld zur Auswertung. Damit war für mich die Entscheidung endgültig gefallen.
Beim Einlesen suche ich nur nach Start- und Endesequenz und werte gleich die Prüfsumme aus. Ist diese falsch, lese ich weiter ein, ist sie richtig, starte ich die Auswertung.
Sollten die Nachrichten für einen UNO zu groß sein, sollte man einen µC mit mehr RAM wählen, kostet keine Reichtümer
Der CRC berechnet die Checksumme sequentiell (CCITT16 - siehe Lammert Bies), und da der Rest streng hierarchisch ist, braucht man nur einen Stack für ein komplettes Paket, keinen Puffer. Man muss nur die CRC-Berechnung immer byteweise miterledigen mit jedem gelesenen Byte.
Also ein Blick in die lib brachte nur großes Staunen, wie unterschiedlich gerechnet wird...
Im Übrigen wird dort mit einem 1024er Block gerechnet, In der Norm sollen es wohl 256 Werte sein..... (unreflektiertes höhrensagen)
Bei dem, was ich bisher gelesen habe, kann ich das bald beten.
Kurzer Zwischendstand. Ich habe nach mehr als 2 Jahren zum ersten Mal einen kompletten Tag - eigentlich sogar 2 - nicht mal Forum gelesen... Und auch sonst musste ich leider Abwege gehen.
Zudem bin ich festgebissen an der CRC und dem Versuch die SML-Elemente in struct's zu packen. Aber dazu mache ich was eigenes auf.
Da der TO mich auch wissen lies, das er derzeit eingeschränkt testen könnte, verzichte ich mal auf Zwischenlösungen und bau das komplett fertig.
Es wird hier also etwas ruhig bleiben.