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