mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Float Variablen ueber UART


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

arbeite mit ATMega16, programmiere in C, verwende WinAVR-Compiler.

Anfaengerfrage: wie uebertraegt man eine float Variable vom PC auf den
uC via UART? Welches ist da die Standard-Loesung?

Ich habe an folgendes gedacht: Da ich zB 1.357 uebertragen moechte
multipliziere ich diese Zahlnoch auf dem PC mit 1000, was dann 1357
ergibt, uebertrage sie in 2 bytes auf den uC, und speichere sie hier
als float wieder ab und teile sie durch 1000. Dann hab ich auf dem uC
meine 1.357.

die zu uebertragenden Zahlen sind im Bereich -3...+3, 3
Nachkommastellen sind ausreichend.

Gibt es einfachere/elegantere Loesungen? Was spricht das Forum?

mg,
Johannes

Gibt es einfachere Loesungen?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genaueste Lösung:
Die Daten auf Binärebene auslesen (mit einer Union bzw. über die
Adresse der Variablen), die 4 Bytes übertragen und im uC wieder die
4Bytes in die Variable schreiben.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke,
das ist eine coole Idee. 4bytes lesen und uebertragen dauert dazu
warscheinlich nicht so lange wie mit 1000 multiplizieren, in bytes
zerhacken, uebertragen, wieder zusammensetzen und dann durch 1000
teilen.

hast du ein kurzes Beispiel bei der hand wie man in C 4 bytes ausliest
(hab sowas am PC noch nicht gemacht)

mg,
Johannes

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Beispiel (ungetestet, sollte aber stimmen):

char * adresse;
adresse=(char *) &floatwert;  //Adresse des floats auf Byteebene lesen

uart_sendbyte(*adresse);   //Bytes über UART versenden
uart_sendbyte(*(adresse+1));
uart_sendbyte(*(adresse+2));
uart_sendbyte(*(adresse+3));

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super! danke.
mg,
Johannes

Autor: Marco S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder übersichtlicher:

union Converter {
  float f;
  char b[4];
}

Converter conv;

conv.f = 1.357;

for (int i=0; i<4; i++)
  UART_sendeByte(conv.b[i]);

Gruß Marco

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.