Float(bzw. single) Variable in Dezimal umwandeln/umrechnen

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Float(bzw. single) Variable in Dezimal umwandeln/umrechnen

      a_475_f10f3094
      Hallo Leute!

      Habe mich grade frisch angemeldet weil ich da so ein "problemchen" habe:

      Es geht darum das ich über die Serielle Schnittstelle ein gewisses Datenpaket empfange und dieses aufsplitten muss um einzellne Werte zu extrahieren. Das ist alles kein problem und funktioniert soweit. Nun folgendes: Warscheinlich mache ich das völlig blödsinnig/umständlich oder ich verstehe es sogar völlig falsch und deswegen bräuchte ich mal Hilfe. Das grundlegende Problem ist einfach das es Fließkomma zahlen sind und ich die natürlich als normale dezimalzahl brauche. Die Daten kommen als ASCII code übermittelt müssen dann in HEX umgewanndelt werden und dann in Binärdaten und müssen dann diese Rechnung durchlaufen die hier auf dieser Website gezeigt wird um wieder den Wert rauszubekommen der übermittelt werden soll: h-schmidt.net/FloatConverter/IEEE754de.html

      Ich kann mir irgendwie nicht vorstellen dass das so richtig ist das ich tatsächlich diese Rechnung selbst ausführen muss. Ein beispiel: Ich weiss das der Wert "1000" übermittelt wird. Das wird empfangen: "68 122 0 0" umgewandelt in HEX is das 447A0000 das in Binär ist 1000100011110100000000000000000 das durch diese Float-Rechnung gejagt ergibt wieder 1000.


      Momentan hab ich beides seperat programmiert (Empfang und verarbeitung des Datenpakets / Float-Rechnung) und beides für sich funktioniert auch einwandfrei. Aus zeitgründen hab ichs bisher noch nicht kombiniert.

      Nun hoffe ich darauf das es eine einfachere Lösung gibt.

      Vielen dank schonmal!
    • Hm. Entweder du hast mich nicht verstanden oder ich verstehe es nicht. Ich habe 4 einzellne bytes gefüllt mit 68, 122, 0 und 0. Ich weiss das es 1000 ist nur muss ich viel rumkonvertieren und rechnen um wieder auf 1000 zu kommen und darum gehts.
    • Nee, ich versteh' nix. Die 4 bytes sind das Format für single-Zahlen, das erkennt man auch schön in deinem link. Und was willst du jetzt haben, was ist bei dir eine Dezimalzahl? Die Zeichenfolge 1000, also ein string?

      Elementary Data Types
      Type
      Bytes used
      Range
      Description
      Bit
      1/8 Byte
      0-1
      A bit can hold only the value 0 or 1. A group of 8 bits is called a byte
      Byte
      1 Byte
      0 to 255
      Bytes are stored as unsigned 8-bit binary numbers
      Integer
      2 Bytes
      -32,768 to +32,767
      Integers are stored as signed sixteen-bit binary numbers
      Word
      2 Bytes
      0 to 65535
      Words are stored as unsigned sixteen-bit binary numbers
      Dword
      4 Bytes
      0 to 4294967295
      Dwords are stored as unsigned 32-bit binary numbers
      Long
      4 Bytes
      -2147483648 to 2147483647
      Longs are stored as signed 32-bit binary numbers
      Single
      4 Bytes
      1.5 x 10^–45 to 3.4 x 10^38
      Singles are stored as signed 32 bit binary numbers
      Double
      8 Bytes
      5.0 x 10^–324 to 1.7 x 10^308
      Doubles are stored as signed 64 bit binary numbers
      String
      up to 254 Bytes

      Strings are stored as bytes and are terminated with a chr(0) byte. A string dimensioned with a length of 10 bytes will occupy 11 bytes
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Ich glaube da wird einfach seriell der Wert 1000 (dezimal) als Single übertragen.
      Das gibt genau die 4 Byte-Werte.

      Versuch mal den Wert als Single wieder einzulesen mit

      Dim singleWert as Single
      Inputbin singleWert

      Dann hast du den Wert erst mal als Single-Wert empfangen.
      Umwandeln dann in Integer:

      Dim integerWert as Integer
      integerWert=singleWert

      Bin mir aber nicht sicher wegen der Reihenfolge der Bytes, die du da angibst.
      Vielleicht werden die nicht als Little Endian, sondern als Big Endian übermittelt.
      In dem Fall musst du die Werte einzeln zuweisen in ein Array, das dem Singlewert überlagert ist (Overload).
    • Pluto25 wrote:

      Dim Floatzahl as Single at Eingangsbuffer Overlay
      Das müsstest du mir etwas genauer erklären.


      Mitch64 wrote:

      Ich glaube da wird einfach seriell der Wert 1000 (dezimal) als Single übertragen.
      Dein vorschlag klingt gut. Das probiere ich sofort.

      Ich hab mal den gesammten Block der übertragen wird als Bild angehängt.
      Was ich darüber weiss:
      - Der Anfang vom Block fängt immer mit BE EF an.
      - Der Wert nach BE EF (C8) bestimmt wieviele Werte ausser dem BE EF noch übertragen werden bevor es wieder von vorne beginnt.
      - Der letzte Wert is eine Checksumme.
      - Den Wert den ich brauche liegt bei Zeichen 75 bis 78 (bzw. einer der Werte)
      Files
      • hc_45122753.jpg

        (157.06 kB, downloaded 12 times, last: )
    • Pluto meint, dass du einen Buffer in Form eines Byte-Array anlegst.
      Die Länge mal mit 256 Byte angeben, da du 1 Byte hast als Länge der Daten.

      Das Paket legst du dann im Array ab dem 1. Index ab.

      Dann dimensionierst du eine Single-Variable für deinen gewünschten Wert.
      Und damit die Adresse der Variable an einer bestimmten Position im Array liegt mit Overlay.

      Etwa so:

      BASCOM Source Code

      1. ' Der Single-Wert würde mit "Buffer + 4" an Offset 4 im Array den Single-Wert auslesen
      2. ' Du musst den Offset noch an die richtige Position anpassen.
      3. Dim Buffer(256) as Byte ' Dein Buffer für die Daten
      4. Dim mySingle as Single at Buffer + 4 Overlay ' Single als Overlay
      Den Offset 77 müsstest du angeben, wenn ich das richtig abgezählt habe.

      The post was edited 1 time, last by Mitch64 ().

    • Okay Leute es schein zu funktionieren. Printbin zu benutzen und das direkt an eine Singlevariable zu übergeben war der Schlüssel! Jetzt muss ich nurnoch den ganzen Block auseinandernehmen und in einzellne Vairablen übergeben! Vielen Vielen Dank Mitch! Ich dachte schon ich muss das Projekt aufgeben!