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

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • 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!
    • ? Deine Fließkommazahl ist eine ganze Zahl? Dann kannst du doch einfach die single in ein dword (oder word) kopieren. (D)word=single.
      Raum für Notizen

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

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

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

      -----------------------------------------------------------------------------------------------------
    • Ah, willst du die Schreibweise mit dem Exponent weg kriegen?
      Geht mit avrhelp.mcselec.com/fusing.htm, dann hast du halt einen string.
      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 schrieb:

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


      Mitch64 schrieb:

      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)
      Dateien
      • hc_45122753.jpg

        (157,06 kB, 24 mal heruntergeladen, zuletzt: )
    • 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-Quellcode

      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.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von 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!
    • Ich habe ein ähnliches Problem wie @Predator32767
      Auch ich will eine Gleitkommazahl in eine Ganzzahl umrechnen.

      Die Daten kommen bei mir über UART wie folgt rein:
      z.B. 01 03 04 45 57 80 00 3F 2F

      Wobei die Daten über UART ursprünglich verdreht rein kommen und ich die Nutzdaten mit swap dann noch drehen muss.
      Daher ist es in meinem Fall nicht möglich, die Single als Olverlay über den Eingangsbuffer zu legen, da ja die Daten verkehrt herum sind.

      BASCOM-Quellcode

      1. Dim Wr_daten(9) As Byte
      2. Dim Ac_leistung As Dword At Wr_daten + 3 Overlay
      3. Inputbin Wr_daten(1) ; 3
      4. Inputbin Ac_leistung
      5. Inputbin Wr_daten(7) ; 2
      6. Swap Ac_leistung '00 80 57 45 -> 45 57 80 00
      7. Locate 1 , 1
      8. Lcd Hex(ac_leistung)
      Alles anzeigen
      Jetzt weiß ich nicht, wie ich das ganze in eine Ganzzahl konvertieren soll?

      BASCOM-Quellcode

      1. Dim Wr_daten(9) As Byte
      2. Dim Ac_leistung As Single At Wr_daten + 3 Overlay
      3. Dim Dezimalzahl As Dword
      4. ...
      5. swap Ac_leistung
      6. Dezimalzahl = Ac_leistung
      Ich kann zwar die Nutzdaten als Single deklarieren, aber ein swap der Single Variable lässt er nicht zu, obwohl in der Bascom Hilfe steht, dass es möglich wäre.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Simon1234 ()

    • Habe es nun hinbekommen.
      Ich habe über die geswapte Variable über Overlay einfach eine Single Variable drüber gelegt.
      Danach folgt die eigentliche Konvertierung in eine DWord Variable.

      Allgemein:

      BASCOM-Quellcode

      1. Dim Eingangsdaten(9) As Byte
      2. Dim Nutzdaten As Dword At Eingangsdaten + 3 Overlay
      3. Dim Gleitkommazahl As Single At Eingangsdaten + 3 Overlay
      4. Dim Ganzzahl As Dword
      5. Swap Nutzdaten
      6. Ganzzahl = Gleitkommazahl