Serielle Kommunikations µC mit floats oder double

Gast #6280400
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.
Gast #6280417
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
#6280522
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.
Gast #6280554
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.
Gast #6280628
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
Gast #6280775
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.
Gast #6280787
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.
#6280802
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.
Gast #6280916
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.
Gast #6281061
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.
#6281122
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren