SML Protokoll identifiziren und zerlegen

Hallo zusammen,

Stehe gerade auf dem Schlauch.

Ich möchte die Zeit zwischen zwei Datenpackeden auf der Seriellen Schnittstelle ermitteln.
Jetzt bin ich mir nicht sicher ob ich gerade die Zeit messe wie lang es dauert ein Datenpacker zu übermitteln, oder die zeit zwischen zwei Datenpackeden.

Interessieren tue ich mich für die zeit zwischen den zwei Datenpackeden.

Ende Pakt bis neues Paket kommt.

Das ist mein Code dazu.

void loop() {
  static unsigned long myTime;
  static unsigned long myTimeTMP;
  myTime = millis();  
  
  if (Serial1.available()) {                    // Daten im Serial1 ? 
    int inByte = Serial1.read();                // Daten auslesen  
    if (inByte < 0x10) Serial.write('0');       // zweistellig, führende 0
    Serial.print(inByte,HEX);                   // Daten ausgabe 
    Serial.write(' ');                          // trenzeichen einfügen
    if (myTime-myTimeTMP>10) {
      Serial.println("; " + String(myTime-myTimeTMP));  //
    }
    myTimeTMP = myTime;    // zeit merken
  } // if 
} // loop

gruß Mücke

Das mit den Codetags hast Du schon mal gekonnt :wink:

Gruß Tommy

1 Like

Ups. da bin ich in der Zeile verrutscht.
Sorry, war keine Absicht, ...

Woran erkennst Du denn das Ende eines Paketes und den Anfang eines neuen?
Davon sehe ich in Deinem Code nichts.

Gruß Tommy

Der Anfang und das ende ist mir unbekannt, bzw. es passt nicht zum SML Protokoll.

Daher dachte ich das eventuell längere pausen zwischen den packenden sind also zwischen den Byte. und ich dachte mir das wenn es länger wie 10ms dauert bis das nächste Byte kommt, dann könnte eventuell ein neues Paket angekommen sein, also mache ein Trennzeichen ";" und gib mir die Wartezeit zwischen den Byte aus und mache einen Zeilenumbruch das hilft beim Lesen :wink:

Ich versuche mein SML zu verstehen. Da mein Start irgend wie nicht korrekt drin steht, dafür aber mein Ende.

Wenn das Ende drin steht, dann ermittle doch dieses und stoppe dann die Zeit bis zum nächsten Zeichen.

Gruß Tommy

Escape-Sequence => 1B 1B 1B 1B
Beginn der SML-Datei => 01 01 01 01
....
Escape-Sequence => 1B 1B 1B 1B
Ende der SML-Datei => 1A

Bei mir sieht das jedoch so aus:

Escape-Sequence => 1B 1B
Beginn der SML-Datei => 01 01 01 01
....
Escape-Sequence => 1B 1B 1B 1B
Ende der SML-Datei => 1A 00 9B FB 1B

Wenn ich es von Hand zerlege was ich bekomme, was ich gerade noch machen muss, da ich das noch nicht so gut ermitteln kann im Code, mir fällt das schwer, und dauert sehr lange.

Dann gehe ich gerade so vor:
Ende suchen, vom Start der Aufzeichnung
Alles bis zum ersten ende rausschmeißen.
Erneut das ende suchen.
alles nach dem Ende raus schmeißen.

So habe ich hoffe ich einen Block an Daten.

Dieser Block hat dann
zwischen 3 und 7 Zeilen. das habe ich ermittelt in dem ich die andern Blöcke mir auch in der Text Datei dargestellt habe.

Am ende der Zeilen habe ich die Zeit von
Zeile 1.: ca. 100 - 150 ms
Zeile 2 - vorletzte: ca. 11 -150 ms
Letzte Zeile 700 - 780 ms

Daher stellt sich gerade mir die Frage habe ich wirklich die Sendepause oder die Übertragungsdauer berechnet in meinen Code?
irgend wie war mir das Klar als ich das geschrieben habe, doch beim noch mal drüber schauen und nachdenken, bin ich dann etwas durcheinander gekommen, und bin mir daher nicht mehr sicher, und dachte ich frage mal.

Hallo Muecke

hast du schon mal hier reingeschaut:

Ich beobachte ja nu schon den xten Versuch Deiner leserei.
Bist Du Dir sicher, das

  • der Zähler überhaupt freigeschaltet ist und das rausbringt, was Du willst
  • der IR-Empfänger das überhaupt verarbeiten kann, was da gesendet wird

Hallo paulpaulson

ja das habe ich, dich diese Thema habe ich es tatsächlich überhaupt hin bekommen "Brauchbare" Daten zu erhalten.

Jedoch ist auch dort der Start etwas länger wie bei mir, und was mich mich Irritiert ist das meine Datenpacktee scheinbar unterschiedlich Groß sind, was mich verwundert.

Daher versuche ich eins nach dem anderen.
und gerade ist mein Ziel heraus zu finden was denn genau ein Paket ist, und dann zu ermitteln wo es anfängt und wo aufhört, ... usw.

Das möchte ich hoffen.
zumindest wir bei mir im Haus immer der ein und der selbe Zähler verwendet, ich habe den Code eingegeben den ich beim Netzbetreiber angefordert habe. (das war ein misst, mit der Taschenlampe.)
Seit dem bekomme ich meinen Aktuellen verbrauch in der untersten Zeile angezeigt im Display, das spricht dafür das er freigegeben ist.
Die Anden machen das alle nicht.

Im Netz wird der TCRT5000 tatsächlich dafür auch vorgeschlagen jedoch mit einem Home Assistant etc. der macht die Auswertung etc für einen, doch extra einen Rechner dafür laufen lassen wollte ich nicht.

Und ja du hast recht, ich mache verschiedene Versuche, und falle sehr oft auf die Nasse das meine nasse noch lebt verwundert mich oft :rofl: so oft wie diese den Boden schrumpfen muss.

Jedoch habe ich so langsam den Eindruck das ich meinen Ziel "oi muggeseggele nehr komm bin".

Gruß Mücke

[EDIT]
wobei ich nicht gefragt habe ob mein lesen richtig geht, ich habe zu beginn die Frage gestellt was für ein zeit ich denn nun berechnen, und die Frage ist noch nicht beantwortet.
und irgend wie will da auch niemand drauf einsteigen so recht, ... habe ich das Gefühl.
in zwischen bin ich mir jedoch sicher das ich die zeit zwischen zwei Zeichen berechne und nicht die Dauer der Übertragung.

Ok, wenn der Zaehler das schon hergibt, dann gilt es die Signalauswertung genau unter die Lupe zu nehmen...

Irgenwo hatte ich mal was beim https://www.mikrocontroller.net/ gelesen...
Versuch mal nen google mit dem zaehlernamen und dem ir-empfänger. evtl. kommt da was. ich bin noch unterwegs....

Weil Dein Code nichts mit Deiner Anforderung zu tun hat, die Zeit zwischen 2 Paketen zu messen. Das hatte ich bereits versucht, Dir zu erklären.
Deine Antwort, was Du alles nicht bestimmen kannst, war da wenig hilfreich.
Nochmal als Klartext (weil Du das wohl nicht so verstanden hast): Wenn Du kein Ende und keinen Anfang der Pakete bestimmen kannst, kannst Du auch keinen Abstand dazwischen messen.

Gruß Tommy

Da habe ich was gefunden, der erste teil passt beim ersten Block :slight_smile:
ich baue mir da gerade was in Excel zusammen, doch heute dann nicht mehr, denn jetzt ruf das Bett, ... :frowning:

Hey @Tommy56,

ich glaube wir reden an einander vorbei. :roll_eyes:

Du hast recht ich habe keine Ahnung wo das Paket anfängt und wo es aufhört.
das macht es natürlich schwierig einen Anfang und ein ende zu finden.

Jedoch bin ich mir sicher das zwischen den Informationen die am Stück gesendet werden eine Längere pause ist als zwischen den einzelnen Zeichen die hintereinander gesendet werden.

Ähnlich wie beim Text, und einen Absatz, der Abstand von Buchstabe zu Buchstabe in einem Absatz ist geringer wie der Abstand zwischen dem letzten Zeichen eines Absatz und dem ersten Zeichen eines Absatzes.

Ich hoffe das meine packte auch so aufgebaut sind und nicht am laufenden band ohne pause gesendet wird (was ich mir nicht vorstellen kann) .
Wenn ich nun die Zweit zwischen jeden Zeichen ermittle und mir ausgeben lasse dann kann ich per Hand drüber schauen und sehe ab wann voraussichtlich ein Absatz gemacht wurde.

wenn ich die zeit kenne, könnte ich anhand der Zeitmessung erkennen wann ein packte aufhört und anfängt.

ich habe das mal als Bild dargestellt. Suche ist das was ich gerne berechnen möchte.

So für heute geht es jedoch ins Bett.

Gruß Mücke

oder mache ich den Falschen Ansatz?
denn mir ist ja noch gar nicht klar ob das was gesendet ist überhaupt zu meinen Protokoll passt also muss ich mir das ja erst mal neutral anschauen?

In Deinem Ursprungsposting schriebst Du:

Da das nicht geht, wenn Du nicht weist, wo die starten und enden, ist jede weitere Diskussion aus meiner Sicht vertane Zeit.

Gruß Tommy

Hallo,

Dein Eingangscode gibt doch jedes empfangene Byte auf die Serielle aus?
Reicht es nicht im Terminalfenster den Zeitstempel mit anzeigen zulassen? Oder ist das zu grob?
Dazu würde ich das wie folgt ändern, dann landet jedes Byte auf einer neuen Zeile und das Terminal fügt links zu jeder Zeile den PC Zeitstempel hinzu. Nach etwas Logging kopierst du den Datensatz in Excel und kannst das weiter auswerten.
Das gleiche Prinzip könntest du mit millis() oder micros() als Zeitstempel im Sketch machen.

Damit hättest du die Zeitabstände zwischen den Bytes. Wenn du dann die Zeit für das letzte Byte noch verrechnen möchtest, kannst du diese eine konstante Zeit mittels bekannter Baudrate berechnen.

void loop()
{
  if (Serial1.available()) {                    // Daten im Serial 1 ? 
    int inByte = Serial1.read();                // Daten lesen  
    if (inByte < 0x10) Serial.write('0');       // zweistellig, führende 0
    Serial.println(inByte, HEX);                // Daten Ausgabe 
  } 
} 

Wenn es ganz genau sein soll und leicht, dann wäre es das Einfachste man klemmt einen Logic Analyzer auf die Tx/Rx Leitung und schaut sich dann in Ruhe an. Saleae Nachbau o.ä.

Kann man darauf nicht verzichten?
Das einfache lesen ohne Prüfung ob was drin ist gibt doch -1 zurück.

Andererseits könnte man mit der Prüfung auch einen Zeitwert merken, der dann ausgewertet wird, wenn .available() FALSE ist.

Hallo,

ohne available() nur mit read() müßte man prüfen ob es größer gleich 0 ist, ansonsten bekommt man ständig -1 auf die Serielle ausgegeben. Oder habe ich einen Denkfehler?