Ich baue ein Framework für ein Datenerfassungssystem, bei dem der Controller (Integer/Float)-Daten an die GUI sendet. Ich habe einige Grundlagenarbeit zu Datentypen und Compilern geleistet und herausgefunden, dass jede Ganzzahl/Float jeweils 2/4 Bytes benötigt.
Mein Zweifel ist, wie man dieses Integer-/Float-Byte in eins vereinen und sie als echten Integer-/Float-Wert in der GUI anzeigen kann.
Dies ist ein Teil der GUI-Programmierung, dem ich vertraue, aber die gesamte Datenkommunikation sendete Daten in Bytes und später wurden diese zusammengelegt und als Float/Int angezeigt.
zB Fall:
Ich brauche mehr Klarheit bei Schritt 4 .
Wenn wir also eine Gleitkommazahl/Ganzzahl in der GUI benötigen, wie sollen wir die Daten, die von den Kommunikationsports (USB/uart) kommen, vereinen?
Dies wäre hilfreich, um mein Verständnis aufzubauen und meine Zweifel auszuräumen, wenn Sie Ihre Meinung vorschlagen.
Wie die Werttypen im Speicher dargestellt werden, hängt von der Architektur (z. B. Little/Big Endian) und den Standards ab, denen sie entspricht.
Beispiel: Der IEEE-Standard für Gleitkommaarithmetik (IEEE 754) ist ein technischer Standard für Gleitkommaberechnungen, der 1985 eingeführt wurde.
Aus der Perspektive eines Mikrocontrollers besteht der einfachste Weg, diese Art von Daten zu senden, darin, sie einfach in dieser nativen (im Speicher) Darstellung mit Zeigern oder Vereinigungen zu senden.
Auf der PC/GUI-Seite verfügen Sie möglicherweise über zusätzliche Ressourcen/Bibliotheken, die Ihnen bei der Umwandlung von Bytesequenzen in Typen helfen. Wie auch immer Sie die Konvertierung durchführen, Sie müssen nur sicherstellen, dass sie dieselben Regeln/Standards verwendet.
Nehmen wir zum Beispiel eine vorzeichenlose 16-Bit-Ganzzahl „i“ mit dem zugewiesenen Wert 1000:
i = 1000
Die Little-Endian-Darstellung wäre
0xE8 0x03
in Erinnerung. Wenn Sie also diesen Wert als seriellen Bytestrom senden möchten, wandeln Sie einfach ´i´ in ´byte´ um und senden Sie zwei Bytes beginnend mit dieser Adresse.
Ihre GUI-Software könnte die Umwandlung in die andere Richtung durchführen, da sie denselben Standard für die Typdarstellung verwendet. Wenn Big Endian verwendet wird, müssen Sie möglicherweise zuerst die Byte-Reihenfolge austauschen.
btw: Auf welche Art von GUI/Sprache beziehst du dich? Beispielsweise bietet C#/.NET umfangreiche Mechanismen zur Typkonvertierung mit der BitConverter-Klasse.
BEARBEITEN Da der Autor erwähnt hat, dass er C# verwendet, hier einige zusätzliche Informationen:
Beachten Sie, dass C# selbst die Endianness nicht definiert. Endianness wird durch Hardware bestimmt. Die meisten Plattformen, die .NET verwenden, sind jedoch LITTLE-Endian. Wenn Sie sicher gehen wollen, können Sie die Endianness des Systems mit dem Feld „BitConverter.IsLittleEndian“ überprüfen, um zu erfahren, wie es sich verhalten wird.
Angenommen, Ihr Mikrocontroller verwendet Little Endian (wie beispielsweise alle (?) Atmel-Controller), können Sie die Bytes aus dem obigen 16-Bit-Int-Beispiel ohne Vorzeichen konvertieren:
UInt16 value = BitConverter.ToUInt16(new byte[] { 0xE8, 0x03 }, 0);
Andernfalls müssen Sie möglicherweise zuerst die Byte-Reihenfolge umkehren.
Abhängig von den Daten, mit denen Sie in Ihrer Anwendung umgehen möchten, sollten Sie Festkommazahlen möglicherweise auf viele Arten in Betracht ziehen
Überprüfen Sie diese Bibliotheksanwendung https://www.allegro.cc/manual/4/api/fixed-point-math-routines/
Eine andere Möglichkeit ist die Verwendung des IEEE-Gleitkommas
So etwas wie „Umwandlung“ gibt es nicht, weil „Byte“ keine Zahlendarstellung ist.
Hex, int, float sind Darstellungen. Somit können 4 Bytes dargestellt werden als:
Wenn Sie also einen 4-Byte-Float haben und diese vier Bytes senden. Dann setzt du sie wieder zusammen und das wars. Es muss nichts umgerechnet werden. 4 Bytes sind 4 Bytes.
Sie müssen Ihrem Compiler jedoch mitteilen, dass die Variable mit den 4 Bytes in einen Float interpertiert werden muss. (Sie haben nicht angegeben, welche Sprache Sie verwenden. Daher nehme ich "C" an). Sie müssen ein Casting durchführen, um auf Ihrer Variablen zu schweben.
Sie können jede Art von Daten über die serielle Leitung senden. Beim Empfang sind die Daten alle ein Bündel von Bits, die in Pakete gepackt sind (je nach Protokoll). Die Aufgabe der Software auf der Empfangsseite besteht darin, die empfangenen Daten richtig zu interpretieren.
Offensichtlich müssen Sie neben den Daten Informationen über die Art der Daten senden. Beispiel: Wenn Byte A empfangen wird, ist das nächste Byte Byte B (Daten) und danach wird Byte C (Daten) empfangen ...
Ignacio Vazquez-Abrams
Blup1980
Connor Wolf
union
. Sie möchten ein char-Array und Ihren Float vereinen.Anfänger91