ich habe folgendes vor. Ich habe meine BWWP (Daikin M-HW 200) soweit, das ich per RS-485 Daten auslesen kann. Zur Zeit verwende ich einen Waveshare RS-485 ETH um mit meinem dev system zu kommunizieren,
Nun ist es so, dass das waveshare die volle länge in einem rutsch senden kann. Bei meiner Symbox mit RS-485 Modul wird aber alle 16 byte getrennt.
Dankenswerterweise habe ich ein festes Startbyte, eine feste Länge und auch die Checksummenberechnung (feritg).
Wie wäre nun das beste vorgehen um das gestückelte zu verarbeiten? Den Buffer in ein array schreiben und jedesmal erst die Feldlänge prüfen und am ende die checksumme? Oder gibt es da was eleganteres?
Danke für den Input. Wer mal spinksen möchte, kann gerne hier einen Blick reinwerfen.
Dafür gibt’s ja den Cutter (Neudeutsch: Zerschneider).
Du kannst ein linkes Trennzeichen angeben (Dein Startbyte) und dann wird alles bis zum nächsten Startbyte übertragen.
Kannst auch ein Timeout zur Synchronisation einstellen.
Ok, nein ist an eine Registervariable gebunden.
Dann so wie du beschrieben hast.
Bei mir schreibt auch für mache Ports die Registervariable in einen Buffer, bzw. hängt hinten an.
Die Auswertroutine prüft bei fester Länge erst auf Mindestlänge, dann prüfen ob das erste Zeichen ein Startbyte ist, wenn nicht wird das erste Zeichen weggeschmissen und neu versucht.
Wenn Message komplett da ist dann aus dem Buffer löschen und auswerten.
vielleicht kann jemand meinen Knoten im Kopf lösen…
Ich bekomme mit dem RS485 von der Symbox die Daten alle 16 Zeichen getrennt
Nun interessieren mich nur die Zeilen die mit DD anfangen und nachfolgende 80 Zeichen sowie die mt D2 und 180 nachfolgende Zeichen. Am Ende ist jeweils eine Checksumme.
Meine erste Idee wäre, in der Funktion ReceiveData() eine Abfrage einzubauen, ob die Zeile ein DD oder D2 enthält.
public function ReceiveData($JSONString)
{
$data = json_decode($JSONString);
$RAWDATA = strtoupper(bin2hex(utf8_decode($data->Buffer)));
if (str_starts_with($RAWDATA, "DD"))
{
//mach was
}
}
Aber wie kann ich dann bestimmen, das auch die fehlenden nachfolgenden Zeilen verwendet werden?
Bei dem Waveshare RS485 ETH bekomme ich die Daten in einem Rutsch, da kann ich mittels str_starts_with die immer am anfang stehenden Zeichen abfragen und das ganze mit substr passend schneiden.
Ein Array oder ein Buffer kann ich so nicht erstellen, da ich die Daten ja alle 16 Zeichen neu bekomme und ich ja das array/Buffer immer überchreiben würde. Muss ich dazu ein attribute benutzen?
Vielleicht hat ja jemand eine idee oder ein Codeschnipsel?
Grober Ablauf:
Erst den Buffer auslesen, dann die neuen Daten anhängen, auswerten und den Rest wieder in den Buffer schreiben.
Beispiel:
// DatenStream zusammenfügen
$head = $this->GetBuffer('Buffer');
$Data = $head . utf8_decode($data->Buffer);
// Stream in einzelne Pakete schneiden
$packet = hier dein Code um es zu zerschneiden auf Länge prüfen usw... Das unvollständige Ende in Buffer speichern
// Rest vom Stream wieder in den EmpfangsBuffer schieben
$this->SetBuffer('Buffer',$tail);
// Pakete verarbeite