Forum: Mikrocontroller und Digitale Elektronik float in einem ascii speichern


von Stringent (Gast)


Lesenswert?

Hallo,

ich habe einen float Wert, den ich gerne in einem String übertragen
möchte.
Der Vorteil des Strings wäre, dass ich einfach eine Reihe an Werten
aneinander schreiben könnte und immer mit dem String-Ende wüsste, wann
Schluss ist. Ich könnt also die vielen vorteilhaften String-Funktionen
nutzen und einfach viele Werte aneinander reihen.

Nun habe ich keine ftoa-Funktion verfügbar, und eigentlich ist der
Aufwand des hin und her wandelns auch relativ hoch, vor allem wo ich
keine Verwendung für die eigentlichen ASCII Werte habe, einzig möchte
ich ein paar Nummern innerhalb eines string Textes speichern.

Gibt es nicht einen Trick, mit dem man den float immer(!) so aussehen
lassen kann, als wäre es igendein ASCII Zeichen?

Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
Buchstaben und lande damit sicher innerhalb des ASCII-Alphabets, mit dem
Vorteil, dass ich den ASCII dann innerhalb meines Strings übertragen
könnte, ich müsst enur für jedenfloat ein Byte für den Nullterminator
spendieren.
Beim Rückwandeln subtrahiere ich und bekomme rundungsfrei den float Wert
zurück.

Kann das gehen?

von holger (Gast)


Lesenswert?

>Kann das gehen?

Nein.

von Helmut S. (helmuts)


Lesenswert?

Dann wandle doch die 4 Bytes zu 8 Hex-Ziffern im ASCII-Code.

von H.Joachim S. (crazyhorse)


Lesenswert?

Stringent schrieb:
> Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
> Buchstaben und lande damit sicher innerhalb des ASCII-Alphabets,

Wie soll das gehen? Jede einzelne Stelle kann (von wenigen Ausnahmen 
abgesehen) den Wert 0..255 annehmen. Und die willst du mit einer simplen 
Addition eines fixen Werte eineindeutig auf 0x20..0x7F abbilden?

Die obige Antwort "Nein" sagt es kürzer :-)

von A. S. (Gast)


Lesenswert?

Ein String überträgt doch beliebige Zeichen, außer 0.

Um 4 Byte also String zu übertragen bräuchtest Du mindestens 5 Werte 
0x01..0xff. Umwandlungen gibt es unendlich viele. Einfache, schwierige, 
lesbare oder kryptische. Was willst Du eigentlich wirklich?

von Markus F. (mfro)


Lesenswert?

Stringent schrieb:
> und einfach viele Werte aneinander reihen

Wir wissen nicht, was der freundliche Tankwart empfiehlt, aber ich 
empfehle zur einfachen Aneinanderreihung von float-Werten ein 
float-Array.

von Christopher J. (christopher_j23)


Lesenswert?

Schau dir mal Base64 an. Damit werden immer 3 Byte zu 4 Ascii-Zeichen 
kodiert. Das ganze kannst du mit beliebig vielen Bytes machen hat aber 
auch immer einen Overhead von mindestens 33%.

von Piter K. (kurczaq)


Lesenswert?

printf verwenden. Der Speicherbedarf ist etwas ungünstig.

von Diopter  . (diopter)


Lesenswert?

dynamisches array
Offenbar geht es um verschiedene Anzahl von float-Werten.

von Wolfgang (Gast)


Lesenswert?

Stringent schrieb:
> Der Vorteil des Strings wäre, dass ich einfach eine Reihe an Werten
> aneinander schreiben könnte und immer mit dem String-Ende wüsste, wann
> Schluss ist. Ich könnt also die vielen vorteilhaften String-Funktionen
> nutzen und einfach viele Werte aneinander reihen.

Und was ist an einem String besser als an einem float array?
Es kostet dich einen Haufen Konvertierzeit und eine ASCII-Darstellung 
verschwendet einen Haufen Speicherplatz.

Auch bei einem String musst irgendetwas haben, um die Länge zu 
kennzeichnen. Manche Programmiersprache verwendet ein 0x00 als letztes 
Byte, andere einen Längenzähler (bei Strings mit max 255 Zeichen, z.B. 
im ersten Byte).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stringent schrieb:
> Kann das gehen?
Du solltest dir dringend mal die Grundlagen zur Zahlen- und 
Zeichendarstellung auf einem binären Rechner ansehen. Insbsondere auch 
das IEEE754 format.

> Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
> Buchstaben und lande damit sicher innerhalb des ASCII-Alphabets
Und auch die binäre Darstellung eines ASCII-Zeichens und dessen 
Wertebereich. Denn wenn ein Byte den Wert 0..255 haben kann, ein ASCI 
aber nur 0..127, was könntest du dann auf das Byte aufaddieren, um mit 
dem halben Wertebereich auszukommen (davon abgesehen sind die 
darstellbaren Zeichen bei ASCII noch weiter eingeschränkt).

Und am besten schaust du das mal aus der Sicht eines µC an. Dort sind 
das nämlich nur 8 (16, 32, ...) Bit breite 
Bithaufen/Vektoren/Register/Worte.

Und wie ein  00110010 00110000 00110001 00110111 zu interpretieren ist, 
das weiß ein µC von sich aus nicht. Erst die Abfolge des darauf 
zugreifenden Programms macht aus diesen Daten möglicherweise 
irgendwelche sinnvollen Dinge.
Diese 4 Bytes könnten z.b. vier unsigned 8-Bit werte mit 50, 48, 49 und 
55 sein. Oder sie könnten ain float mit dem Wert 1.02557385E-8 sein, 
oder die Zeichenkette "2017"...

: Bearbeitet durch Moderator
von Georg (Gast)


Lesenswert?

Wolfgang schrieb:
> Auch bei einem String musst irgendetwas haben, um die Länge zu
> kennzeichnen. Manche Programmiersprache verwendet ein 0x00 als letztes
> Byte

Das hat zwar den Vorteil, dass solche nullterminierten Strings so lang 
werden können wie der Speicher gross ist (oder die Festplatte), aber

Stringent schrieb:
> Ich könnt also die vielen vorteilhaften String-Funktionen
> nutzen

Die sind nicht wirklich effektiv, weil man ja nicht wissen kann, wo die 
terminierende Null steht - bei einem 20 kByte langen String muss also 
schon allein die Funktion zur Längenbestimmung den ganzen String von 
vorne an bis zum Ende lesen. Für embedded Software sind solche Strings 
i.A. wenig geeignet.

Georg

von Jack (Gast)


Lesenswert?

Stringent schrieb:
> ich habe einen float Wert,

Und warum? Hat sich das irgendwie so ergeben, weil sich das bequem im 
Mikrocontroller programmieren lies oder gibt es einen ernsthaften Grund 
dafür?

Was ich sagen will, mit Integer-, Festkomma- und vergleichbaren 
Zahlenformaten fährt man in einem kleinen Mikrocontroller meist besser. 
Besonders, wenn man, wie du es andeutest, sich keine Wandelfunktionen 
leisten kann.

Also, geh noch mal in dich und frag dich, ob du wirklich float brauchst.

> den ich gerne in einem String übertragen
> möchte.
> Der Vorteil des Strings wäre, dass ich einfach eine Reihe an Werten
> aneinander schreiben könnte und immer mit dem String-Ende wüsste, wann
> Schluss ist.

Du müsstest dir schon überlegen, was euer dich ein "String-Ende" ist. 
0x0D 0x0A, 0x0A, 0x00 oder ähnliches.

> Ich könnt also die vielen vorteilhaften String-Funktionen
> nutzen und einfach viele Werte aneinander reihen.

Also für Stringfunktionen hast du Platz im Mikrocontroller?

> Nun habe ich keine ftoa-Funktion verfügbar,

Die ließe sich auftreiben. Wenn nicht in der Standard-Bibliothek für 
deinen Mikrocontroller und Compiler, dann als separate Bibliothek. Ein 
paar Hundert Zeilen Code für eine Wandlunge mit ein paar Vereinfachungen 
dürften es schon sein.

> Gibt es nicht einen Trick, mit dem man den float immer(!) so aussehen
> lassen kann, als wäre es igendein ASCII Zeichen?

Nicht ein einzelnes Zeichen. Acht ASCII-Zeichen gehen sehr leicht. Dazu 
wandelt man jedes der vier einzelnen Bytes eines float in eine 
zweistellige  Hex-Darstellung um. Code fuer das Wandeln eines Bytes nach 
Hex gibt es wie Sand am Meer.

> Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
> Buchstaben

> Kann das gehen?

Nein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.