Forum: Mikrocontroller und Digitale Elektronik Serielle Kommunikations µC mit floats oder double


von xone_96 (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade an einem µC-Projekt und möchte eine Serielle 
Schnittstelle für die Übertragung von µC zu PC verwenden.
Ich würde nur float Datentypen übertragen wollen. Wie ist denn das 
standardmäßige vorgehen so etwas zu machen? Aktuell empfange ich alles 
ASCII kodiert.

von minifloat (Gast)


Lesenswert?

xone_96 schrieb:
> ASCII

Du kannst so schon mal Fehler abfangen, wenn eine Nachricht keine 
sinnvollen Zeichen enthält, also was anderes als
0-9 + - E e . ; \r \n und spaces
verwerfen, Fehler melden usw.

xone_96 schrieb:
> standardmäßige vorgehen
Benutze z.B. Modbus. Damit gibt es auch gleich eine Checksumme. Wie du 
die Daten interpretierst, musst du eh selber wissen. Es empfiehlt sich 
aber ein Layout der Daten(typen) zu dokumentieren.

mfg mf

von Stefan F. (Gast)


Lesenswert?

xone_96 schrieb:
> Wie ist denn das standardmäßige vorgehen so etwas zu machen?

Es gibt kein Standard Verfahren, sondern viele unterschiedliche bewährte 
Methoden. Die Zahlen in Form von Text zu übertragen, ist eine davon.

von Dirk B. (dirkb2)


Lesenswert?

xone_96 schrieb:
> ASCII

Das hat auch den Vorteil, dass die internen Darstellungen nicht 
übereinstimmen müssen.

Und man kann mal auf der Leitung einfach mitlauschen.

von Pandur S. (jetztnicht)


Lesenswert?

Ich pack (cast) jeweils
Int32, Int16, Int8, Char, Float32 .. alles, als Little Endian, auf ein 
Bytearray und schiebs auf den Transmit Ringbuffer

Strings uebertrage ich als Laenge zuerst, dann den String, ohne die Null 
am Ende.

von Toby P. (Gast)


Lesenswert?

xone_96 schrieb:
> Aktuell empfange ich alles ASCII kodiert.

Würde ich auch nicht ändern, es sei denn es funzt nicht.

von Ingo E. (ogni42)


Lesenswert?

ASCII ist aus o.g. Gründen sicherlich OK. Du solltest Dir aber bewusst 
sein, dass das alles andere als effizient ist - sofern das eine Rolle 
bei Deiner Anwendung spielt.

VZ = Vorzeichen
Zx = Ziffer x
DP = Dezimalpunkt
Expx Exponentziffer
Cx = Charakteristikbit

ASCII  VZ Z0 DP Z1...Z7 E VZ Exp0 Exp1 Exp2 insgesamt 15 Zeichen (Byte)
Binär VZ C0...C7M0...M22 4 Byte

Du kannst also binär fast viermal soviele Zeichen pro Zeiteinheit 
senden.

von Toby P. (Gast)


Lesenswert?

Ingo E. schrieb:
> Du kannst also binär fast viermal soviele Zeichen pro Zeiteinheit
> senden.

Zumal das noch in ascii und wieder zurück kodiert werden muss.

Das wird er auch selber wissen. Wenn der Wert alle halbe Stunde 
übertragen wird ist das was anderes als im µs Rhytmus.

von oldmax (Gast)


Lesenswert?

Hi
Ich hab vor ein paar Tagen auf (m)ein kleines Buch hingewiesen. Da wird 
eine Programmentwicklung in VB beschrieben, welches Variableninhalte von 
einem Controller empfängt und in verschiedenen Formaten zur Ansicht 
liefert. Gut, ist für Assembler, aber durchaus auch für andere 
Controllerprogrammierung anwendbar. Die Grundlagen dazu sollten 
erkennbar sein. Schau mal nach dem Beitrag "Kommunikation AVR <> PC über 
RS 232". Da findest du den Link.
Gruß oldmax

von c-hater (Gast)


Lesenswert?

Dirk B. schrieb:

> xone_96 schrieb:
>> ASCII
>
> Das hat auch den Vorteil, dass die internen Darstellungen nicht
> übereinstimmen müssen.

Lach'

Das fängt schon an mit Komma vs. Punkt, geht weiter mit "E" 
verpflichtend oder optional, Sign nach "E" obligatorisch oder nur für 
"-" erforderlich usw. usf.

Sprich: ASCII-Repräsentation hilft bei der einheitlichen Darstellung von 
Gleitkommazahlen nicht wirklich weiter. Es bleiben so viele mögliche 
Inkompatibilitäten, da kann man auch gleich die vielfach effizientere 
binäre Repräsentation nehmen. Zumal es nicht so furchtbar viele 
praktisch relevante  gibt (theoretisch gibt es natürlich unendlich 
viele)...

Es muss halt nur eine der praktisch relevanten für's Protokoll 
spezifiziert werden und schon ist der Drops gelutscht.

von Stefan F. (Gast)


Lesenswert?

Ich glaube er hatte kein Weltumfassen einheitliches ASCII Protokoll 
gesucht, sondern eins für seine Programme die er selbst schreibt. Da hat 
die genannten Punkte alle selbst im Griff.

Wenn man aber Fließkommazahlen einfach binär überträgt muss man schon 
viel Glück haben, dass die Plattform am anderen Ende der Leitung genau 
das gleiche Format verwendet.

von Marco H. (damarco)


Lesenswert?

https://de.wikipedia.org/wiki/IEEE_754
je nachdem welche Genauigkeit du benötigst 32 oder 64bit.

oder als ASCII https://de.wikipedia.org/wiki/Wissenschaftliche_Notation

zum Probieren https://www.h-schmidt.net/FloatConverter/IEEE754de.html

alternativ aus multiplizieren so das kein float mehr besteht.

0,1 * 100 = 10 ;)

Die Auswirkungen der Seiteneffekte muss du einschätzen.

von A. S. (Gast)


Lesenswert?

Standardmäßig nimmt man ein Protokoll. Die haben meist eine fest 
definierte Start- und/oder Endsequenz, oft noch Checksumme und 
sequencecounter, manchmal zusätzlich die Länge oder als Ersatz für die 
Endekennung.

Und dann natürlich Festlegungen zu den Daten.

Beispiel ASCII: meist nur ein Endezeichen (/n) und Leerzeichen trennt 
die Daten.

ASCII ist wirklich gut. Und man muss sich zusammenreißen, es nicht durch 
was tolles zu ersetzen, das 3 Mal kompakter ist, nur um statt 90% freie 
Leitung dann 97% zu haben

Eine Checksumme ist auch in ASCII möglich. Und die Wandlung  per printf 
oder scanf ist peanuts im Vergleich zum Gesamtaufwand.

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> Ich glaube er hatte kein Weltumfassen einheitliches ASCII Protokoll
> gesucht, sondern eins für seine Programme die er selbst schreibt. Da hat
> die genannten Punkte alle selbst im Griff.

An beiden Enden? Weil, wenn ja, wird dieses Argument zum Null-Argument:

> Wenn man aber Fließkommazahlen einfach binär überträgt muss man schon
> viel Glück haben, dass die Plattform am anderen Ende der Leitung genau
> das gleiche Format verwendet.

Da muß man dann nämlich auch nur eine Darstellung in eine andere 
konvertieren. Ganz genauso, als wenn man inkompatiblen ASCII-Kram hat.

Da es aber viel weniger praktisch relevante Binärformate gibt als es 
Varianten der ASCII-Darstellung von Gleitkommazahlen gibt, ist es viel 
einfacher, das binär abzuhandeln.

von Sven B. (scummos)


Lesenswert?

Ich würde mir nochmal überlegen, ob ich wirklich Fließkomma brauche. Das 
brauche ich eigentlich nur dann, wenn der Wert, den ich übertragen will, 
sehr viele Größenordnungen umspannt. Das ist schon generell sehr selten 
der Fall.

Andernfalls wähle ich einfach ein passendes Präfix -- ich muss ja meine 
0.017 V nicht als Fließkomma übertragen, sondern kann auch einfach die 
Einheit als mV oder µV wählen und dann "17" oder "17000" als Integer 
schicken. Sprich, Fixkomma. Einfacher, schneller, exakt.

Fließkomma braucht man, wenn man mal wirklich nachdenkt, außerhalb 
numerischer Rechnungen (Simulationen o.ä.) eigentlich kaum.

von Dirk B. (dirkb2)


Lesenswert?

c-hater schrieb:
> Das fängt schon an mit Komma vs. Punkt, geht weiter mit "E"
> verpflichtend oder optional, Sign nach "E" obligatorisch oder nur für
> "-" erforderlich usw. usf.

Wer da ein Komma nimmt ist selber schuld.
Den Rest erledigt strtod auf PC Seite.

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.