LabVIEWForum.de - C-Struct über TCP an Labview senden

LabVIEWForum.de

Normale Version: C-Struct über TCP an Labview senden
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo!

Ich habe ein Instrument, dass ständig über einen LAN-Anschluss Daten sendet.
Die Daten sind in einer C-Struktur zusammengefasst:

struct data_str
{
long DataType;
long l_arr[3];
float f_arr[14];
};

Ich habe versucht, aus dem Output vom "TCP-Read"-VI mit dem "Unflatten From String"-VI mit einem
Labview-Cluster am "type"-Input die Daten zur weiteren Verwendung umzuwandeln.
Dabei kommt leider aber nur Müll raus und die Fehlermeldung:

Unflatten or byte stream read operation failed due to corrupt, unexpected, or truncated data.

Kann mir jemand dabei helfen?

Mir ist auch nicht ganz klar, wieviele Bytes ich beim TCP-read auslesen soll. 72 (nur die reinen Daten) oder
80 (Daten + Array-sizes)?

Danke schonmal!
Schon mal die Rohdaten angeschaut, indem du dir den empfangenen String im HEX-Format anzeigen lässt?
Oder die Kommunikation mit einem Tool wie z.B. Wireshark abgefangen und protokolliert?
Mglw. passt auch die Anordung der Bytes innerhalb einen I32 nicht? LV verwendent MSB als erstes.

Gruß, Jens
Hi
Unflatten froam String hilft hier nicht. Du musst einen Type-Cast benutzen, s.h. LV-Hilfe.
Dabei must noch möglicherweise Bytes und oder Words swappen je nach herkunft der Daten. Stichwort: Little/Big-Endian.

Gruß Holger
(27.10.2011 15:13 )dheyner schrieb: [ -> ]Hallo!

Ich habe ein Instrument, dass ständig über einen LAN-Anschluss Daten sendet.
Die Daten sind in einer C-Struktur zusammengefasst:

struct data_str
{
long DataType;
long l_arr[3];
float f_arr[14];
};

Ich habe versucht, aus dem Output vom "TCP-Read"-VI mit dem "Unflatten From String"-VI mit einem
Labview-Cluster am "type"-Input die Daten zur weiteren Verwendung umzuwandeln.
Dabei kommt leider aber nur Müll raus und die Fehlermeldung:

Unflatten or byte stream read operation failed due to corrupt, unexpected, or truncated data.

Kann mir jemand dabei helfen?

Mir ist auch nicht ganz klar, wieviele Bytes ich beim TCP-read auslesen soll. 72 (nur die reinen Daten) oder
80 (Daten + Array-sizes)?

Danke schonmal!

Waahrscheinlich versuchst Du einen Cluster zu bauen mit einem int32, einem array mit int32 und einem array mit float. Aber das ist eben nicht dasselbe wie eine C Struktur mit FIXED Size arrays. Fixed Size arrays werden von einem C Compiler inlined, d.h. sie sind identisch zu einem LabVIEW Cluster der entsprechend viele Elemente enthält. Du solltests also einen LabVIEW Cluster bauen, der eine int32, ein Cluster mit 3 * int32 und ein weiterer Cluster mit 14 single precision Floats enthält. Und nun kannst Du auch Typecast verwenden, was bei Clutern mit Arrays eben nicht geht. Flatten funktioniert aber auch und hat den Vorteil dass Du direkt die Endianess der Daten angeben kannst. LabVIEW verwendet Big Endian Format, aber wenn Dein C Programm auf einem anderen System dann einem PPC MAc läuft, kommen die Daten mit grosser Wahrscheinlichkeit im Little Endian Format. Bei Verwendung der Typecast Funktion musst Du das Swappen der Bytes allenfalls selber machen, indem der reultierende Cluster noch durch Swap Bytes und Swap Words Funktionen geführt wird.
Danke für die Antworten. Nachdem ich rausbekommen habe, wie groß die
C-Struktur im Speicher war, habe ich das Bytearray zerpflückt und
über "unflatten from string" benutzt. Das hat das Problem dann gelöst.
Nicht elegant aber läuft...
Referenz-URLs