Gui-Float-Daten vom Mikrocontroller

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:

  • Schritt 1: Controller sendet Float- Daten an die GUI.
  • Schritt 2: Controller und Compiler teilen die Daten in 4 Bytes auf.
  • step3: Gui erhält 4 Bytes.
  • Schritt 4: Gui wandelt Recieved 4 Bytes in Float um und zeigt es auf der GUI an.

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.

Schritt 4 ist ein Softwareproblem.
Als Nebenbemerkung. Sie haben das Tag PIC verwendet. Und PICs (vielleicht nicht die neuesten) haben keine Gleitkommaunterstützung in der Hardware. Alle Berechnungen, die Float verwenden, benötigen viele Zyklen zur Ausführung. Sind Sie sicher, dass die Festkommazahl hier nicht ausreicht? In diesem Fall wäre es viel effizienter.
Angenommen, Sie verwenden C, dann ist der relevante Begriff hier union. Sie möchten ein char-Array und Ihren Float vereinen.
Hallo, ich bin Ihnen allen für Ihre Eingaben dankbar. Ich habe keine Probleme beim Senden der Daten über den USB-Pic-Controller und sie sind in Bytes ... und 64 Bytes in einem Format. Ich vertraue also darauf, dass die Gui die Daten in kategorisieren muss 4 Bytes und rekonstruiere die Nummer. Ist der Piccontroller Little Endian?.

Antworten (4)

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.

Sie müssen also den Endian-Typ in der Software kennen, oder? Nun, ich verwende Visual Studio Cis.
Ja, siehe mein EDIT zur Antwort. Ich habe ein Beispiel mit C# eingefügt.
Würde 1000 nicht in Little Endian als 0x03 0xE8 dargestellt? Das 0xE8 befindet sich in der unteren Adresse, da es das niederwertigste Byte ist.
Little Endian bedeutet, dass das niedrigstwertige Byte in der kleinsten MEMORY-Adresse gespeichert wird. Stellen Sie sich ein sequentielles Speicherlayout vor, bei dem sich das erste Byte an einer niedrigeren Adresse als das nächste befindet. Das zuerst kommende Byte liegt also an der niedrigeren Adresse.

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

  • nur 8-Bit-Bruch x sein Wert wäre x/255
  • 8-Bit-Integer x mit 8-Bit-Bruch y und seinem Wert x+y/255
  • 8-Bit-Bruch x mal 2 hoch 8-Bit-Ganzzahl y, (x/255)*2^y
  • 8-Bit-Bruch x mal 10 hoch 8-Bit-Ganzzahl y, (x/255)*10^y
  • alle oben genannten, aber mit 16-Bits für x und y

Ü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

32-Bit-IEEE-Float

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:

  • eine ganze Zahl ohne Vorzeichen von 0 bis 4294967295
  • eine ganze Zahl mit Vorzeichen von - −2147483648 bis +2147483647
  • ein Schwimmer

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.

Außerdem gibt es mehrere Festkommaformate, die in 4 Bytes dargestellt werden können.

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