binäre Daten wandeln
-
Hallo Leute,
ich würde gerne eine serielle Schnittstelle eines Messgerätes auslesen, die Daten sind aber binär codiert und ich blicke es nicht diese umzuwandeln.Die Struktur ist aus der Beschreibung des Herstellers:
Datentypen <dateType> und <measuringDataType> typedef struct { unsigned second:4; // Sekunde Einer (0...9) unsigned second10:4; // Sekunde Zehner (0...5) unsigned minute:4; // Minute Einer (0...9) unsigned minute10:4; // Minute Zehner (0...5) unsigned hour:4; // Stunde Einer (0...9) unsigned hour10:4; // Stunde Zehner (0...2) unsigned date:4; // Tag Einer (0...9) unsigned date10:4; // Tag Zehner (0...3) unsigned month:4; // Monat Einer (0...9) unsigned month10:4; // Monat Zehner (0,1) unsigned year:4; // Jahr Einer (0...9) unsigned year10:4; // Jahr Zehner (0...9) } dateType; typedef struct { uint id; // Identifikationsnummer (eindeutig) (2 Byte) uint stepLength // Stufendauer in Sekunden (2 Byte) unsigned status:4; // Status, Markierung: Error-Code ... (4 Bit) unsigned measuringType:2; // Typ der Messung (2 Bit) unsigned startFlag:1; // Startmarkierung, 1 = erster Datensatz (1 Bit) unsigned endFlag:1; // Endemarkierung, 0 = kein Ende, 1 = Ende (1 Bit) uint value; // Messwert (2 Byte) uchar temp; // Temperatur (1 Byte) dateType date; // Datum/Uhrzeit (6 Byte) } measuringDataType;Ich bekomme die Daten über die Com1 rein und hätte sie gerne als double.
Leider geht das über mein bisheriges Können hinaus.
Möglicherweise kann es mir ja jemand helfen. DankeGruss Myerscola
-
Hallo,
Wie liest du denn die Daten ein?
-
Mit dem Demo-Projet der Komponente TMSAsync.Ich kann als ASCI "getmdata" senden und erhalte dann "putmdata" zürück, anschließend sendet das Gerät 3504 Byte Daten, die ich als unverständliche ASCI-Zeichen erhalte. An der Stelle bin ich dann mit meinem Latein am Ende

-
Ich meine damit, in was für einer Variablen (Typ) landen die Daten. Ist es ein Stream? So eine Umwandlung läßt sich recht einfach über einen Stream machen indem man die read/write Funktionen verwendet. Dann hättest du die Daten erstmal in Variablen des Typs den du oben angegeben hast. Die mußt du dann nur noch umwandeln.
dateType datet; // irgendwie gefüllt. int sec = datet.second + datet.second10*10; // usw.Wie du die Daten dann weiterverwenden willst weiß ich ja nicht.
-
Die Daten landen in einem Memo Feld und sind AnsiString.
Ich lese mit - VaComm1->ReadText().
-
Binäre Daten würde ich auch binär einlesen, sonst bekommst du Probleme mit fehlerhaft erkannten Zeilenendkennzeichen usw.
Ich kenne nun deine Komponente nicht und weiß somit auch nicht genau was ReadText() macht.
-
Wie sehen die daten den aus???
ASCII-HEX: %31%32%32%33
ASCII: 010203 dabei wir jedes Byte durch 2 ASCII-Zeichen repräsentiert> 01 = 0x01, 02 = 0x02
-
leider habe ich auch keine ASCI-Zeichennummern, sondern nur die Anzeige im Memo von Quadraten und anderen Zeichen mit denen ich nix anfangen kann.
Der Vorschlag von Braunstein klingt gut, ich weiß nur nicht wie ich einen Stream von dem Gerät bekomme.
-
hab mir die VaComm mal angesehen...
mit ReadBufUsed erhält du die anzahl von zeichen die sich momentan im inputbuffer befinden
mit ReadBuf kannst du das ganze in einen eigenen buffer auslesen. über diesen buffer kannst du dann den struct legen und somit kommst du an die daten....
oder du liest direkt in den struct ein
zB.
dateType date;
VaComm1->ReadBuf(&date, sizeof(dateType));vorher musst du aber überprüfen ob genügend daten im inputbuffer sind...
-
Klingt gut, kann aber erst wieder morgen testen, danke erst mal an alle Tippgeber.
Gruss myerscola