Hallo zusammen,
ich brauche Eure Hilfe, liebe Gurus des Forums!
Ich habe ein Problem beim Parsen eines Binär-Strings, und zwar
ein Messgerät liefert mir die Messdaten im Binärformat. Diesen String möchte ich deserialisieren mittels der "String deserialisieren"-Funktion! Alles was mit UINT 16 klappt wunderbar (s. Anhang), außer CHAR (String incl. End Of String character). In der Definition des Binär-Strings steht folgendes:
Byte Nr: 1,2 Format: UINT16 Inhalt: 0-standby.....usw.
....
.
.
Byte Nr: 29...34 Format: CHAR Inhalt: Substanzname
Byte Nr: 35,36 Format: UINT16 Inhalt: 0-....usw.
und ab hier funktioniert bei mir nicht. Ich komme nicht weiter(((((Es wird nicht's angezeigt, obwohl die Substanz erkannt wurde. Was ich an der Stelle falsch mache??
Ich freue mich sehr auf Euren Antwort und bin für jeden Typ dankbar!
Gruß
Lessy
Ich nehme mal an dass die Datenquelle keinen serialisierten Labview Cluster übermittelt sondern eben einfach serialisierte Daten nach dem von dir angegebenen Muster.
Heist: Das kannst du so nicht zwingend einfach über nen Labview - Cluster modellieren.
Soweit ich weist musst du wirklich den String entsprechend zerteilen (selbst) und dann die Typecasts machen die du brauchst (ergo: Wenn die ersten 6 Bytes 3 U16 entsprechen, dann trennst du die ab und castest die auf U16, wenn danach nen String kommt der 5 zeichen Lang ist, dann musst du die 5 zeichen abtrennen und casten auf nen String etc. pp.).
Denke mal hauptsächlich bricht das bei dir weil labview vermutlich ne Angabe zur String länge erwartet die nicht kommt (könnte mir vorstellen die wird als I16 / I32 abgelegt und das würde in deinem Fall nen negativen Wert ergeben - das ist aber nur geraten).
Simpel gesagt: Woher soll Labview denn "wissen" dass dein String an der Stelle 5 zeichen lang ist?
Bottom Line:
Wenn du nicht einen serialisierten Cluster als Datenquelle hast, dann musst du den selbst parsen.
*edit*
Achja, dass vielleicht auch nochmal: Du kannst mehrere Aufeinanderfolgende identische (Typ z.B. U16) Elemente FESTER LÄNGE natürlich auch gleichzeitig abtrennen und dann auf nen Array casten. Wenn du das mit deserialisieren machst musst du darauf achten, dass "Array / String Länge anhängen" auf False ist (da der sonst die erste Zahl als länge des Arrays interpretiert). Aber wie gesagt nochmal: Das zerlegen des Strings musst du selbst übernehmen (nach den dir bekannten Vorgaben).
In der Hilfe steht:
Array- oder String-Größe voranstellen? gilt nur für Daten von nicht hierarchischen Elementen. Arrays und Strings in hierarchischen Datentypen wie Clustern enthalten immer Angaben zur Größe.
Also bei einem Cluster bei "String-Länge voranstellen" irgendwas eingeben - man besten gar nichts.
Von den Ursprungsdaten sollte vor der Serialisierung ein Cluster gebildet werden. Dann wird vor dem String die Länge mit übergeben. Offensichtlich ist das bei Dir nicht der Fall. (Diesen entscheidenden Teil hast Du sauber ausgeblendet, Du wolltest es den "Gurus" nicht zu einfach machen
)
Umständlichere, weniger flexible Möglichkeit: Du manipulierst den ankommenden String und fügst vor dem 6-byte String die 4 Byte Stringlänge "\00\00\00\06" ein. Die wird nämlich bei einem Cluster erwartet. Dann wie gehabt deserialisieren.
[
attachment=43496]
Erstmal Danke für die schnellen Antwort, Kiesch
mit dem Thema "Serialisieren und deserialisieren" war ich noch nicht beschäftigt und kenne mich hier nicht gut aus. Ich verwende nur das, was ich im Internet gefunden habe. Aber das macht nicht viel aus((((
(11.02.2013 16:21 )Kiesch schrieb: [ -> ]Soweit ich weist musst du wirklich den String entsprechend zerteilen (selbst) und dann die Typecasts machen die du brauchst (... wenn danach nen String kommt der 5 zeichen Lang ist, dann musst du die 5 zeichen abtrennen und casten auf nen String etc. pp.).
wie macht man das? gibt es ein Beispiel, wie man die Zeichen abtrennt?
(11.02.2013 16:21 )Kiesch schrieb: [ -> ]Simpel gesagt: Woher soll Labview denn "wissen" dass dein String an der Stelle 5 zeichen lang ist?
Wie soll ich das (Stringlänge) festlegen (n-zeichen-String)?
Bottom Line:
(11.02.2013 16:21 )Kiesch schrieb: [ -> ]Wenn du nicht einen serialisierten Cluster als Datenquelle hast, dann musst du den selbst parsen.
Wie erkenne ich, dass ich als Datenquelle keinen serialisierten Cluster bekomme??
Danke im Voraus.
Gruß
Lessy
Danke Dir, Lucki für Deine Antwort,
ich kann schon damit was anfangen!!
(11.02.2013 19:35 )Lucki schrieb: [ -> ]Von den Ursprungsdaten sollte vor der Serialisierung ein Cluster gebildet werden. Dann wird vor dem String die Länge mit übergeben. Offensichtlich ist das bei Dir nicht der Fall.
Den Cluster mit allen Parameter, die in der Dokumentation stehen bzw. bekommen werden, habe ich erstellt. Aber mit dem String, der 6-Byte lang ist, ist mir nicht ganz klar, wie man das richtig machen soll, um den Wertauf der Anzeige hinzukriegen??
(11.02.2013 19:35 )Lucki schrieb: [ -> ](Diesen entscheidenden Teil hast Du sauber ausgeblendet, Du wolltest es den "Gurus" nicht zu einfach machen )
Auf keinem Fall, Entschuldigung!
(11.02.2013 19:35 )Lucki schrieb: [ -> ]Umständlichere, weniger flexible Möglichkeit: Du manipulierst den ankommenden String und fügst vor dem 6-byte String die 4 Byte Stringlänge "\00\00\00\06" ein. Die wird nämlich bei einem Cluster erwartet. Dann wie gehabt deserialisieren.
Wie kann ich die 4-Byte einfügen?
Danke im Voraus.
Gruß
Lessy
Hier ein Screenshot zur Erklärung von Kiesch:
[
attachment=43521]
Das ist das Standard-Vorgehen, wenn man irgendwelche Daten in Binärform von irgendwo erhält. Man unterteilt das Ganze in die Abschnitte, die man gut "manipulieren" kann.
Gruß, Jens
Due hängst 2 neue Bilder an, ohne etwas dazu zu sagen. Falls das rechte Bild der Cluster ist, den Du serialisierst, dann würde das nicht zu dem in Posting #1 erklärten Binärstring passen. Denn bei der Serialisierung würde automatisch die Zeichenlänge zu jedem String mit eingefügt.
Der String würde also nicht so:
Byte Nr: 1,2 Format: UINT16 Inhalt: 0-standby.....usw.
....
Byte Nr: 29...34 Format: CHAR Inhalt: Substanzname
Byte Nr: 35,36 Format: UINT16 Inhalt: 0-....usw.
sondern so aussehen:
Byte Nr: 1,2 Format: UINT16 Inhalt: 0-standby.....usw.
....
Byte Nr: 29...32: Stringlänge
Byte Nr: 23...37 Format: CHAR Inhalt: Substanzname
Byte Nr: 38,39 Format: UINT16 Inhalt: 0-....usw.
Wenn der String aus dem Messgerät eines Fremdherstellers kommt, dann sieht die Sache anders aus, dann muß man es so machen wie im Beispiel von Jens.
Oder man fügt die Stringlänge noch ein. Dann kommt man ganz einfach zu dem von Dir gewünschten Cluster. Aber leider muss man die Bytes noch tauschen, und das geht nur mit zusätzlichem Code (die For-Schleife im angehängtem Beispiel).
[
attachment=43524]
(12.02.2013 15:21 )jg schrieb: [ -> ]Hier ein Screenshot zur Erklärung von Kiesch:
Das ist das Standard-Vorgehen, wenn man irgendwelche Daten in Binärform von irgendwo erhält. Man unterteilt das Ganze in die Abschnitte, die man gut "manipulieren" kann.
Gruß, Jens
Ich bedanke mich ganz herzlich für die Erklärung, wie man einen string zerteilt und für den Screenshot!!!! Das hat mir sehr geholfen!!! Superrr!
Gruß
Lessy
(12.02.2013 15:32 )Lucki schrieb: [ -> ]Oder man fügt die Stringlänge noch ein. Dann kommt man ganz einfach zu dem von Dir gewünschten Cluster. Aber leider muss man die Bytes noch tauschen, und das geht nur mit zusätzlichem Code (die For-Schleife im angehängtem Beispiel).
Danke, Lucki, für das Beispiel. Damit kann ich weiter vorgehen!
Gruß
Lessy
Hi
Da ich ein ähnlichers Problem hatte bin ich bei meiner Suche auf diesen Beitrag hier gestoßen.
Auf Basis der Antwort von Lucki habe ich mir das mal angesehen und für dieses Problem ein paar VI's gebaut die ich hier mal für künftige Fragesteller in der LV2016 Version anhänge.
So können Strings und Arrays in Cluster deserialisiert werden, man muss allerdings den Index und die Länge der Strings und Arrays kennen.
Es ist zwar nicht das Optimum aber es geht eben mal nicht anders wenn die Quelle keine Parameter zur String- oder Arraylänge mitsendet.