(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.