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.
xone_96 schrieb: > Aktuell empfange ich alles ASCII kodiert. Würde ich auch nicht ändern, es sei denn es funzt nicht.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.