float via UART am ATMega16 empfangen (in C)

Gast #288004
Lesenswert?
• ▲
▼
Hallo,

hier ein Programm das eine float Variable innerhalb eines ganz simplen
protocols empfaengt.
getestet mit folgendem System:
Code in C
WinAVR Compiler
ATMega16 mit 16 MHz

Source Code ist relativ gut auskommentiert.

mg,
Johannes
Angehängte Dateien:
Gast #288005
Lesenswert?
• ▲
▼
hallo,

vielleicht sollte ich noch kurz dazuschreiben wie die bytes uebertragen
werden:

....

union{
     float r;
     uint8_t v[sizeof(float)];
     } u;
unsigned char send_command[7];
....
u.r = 123.456;  //hier die float Variable speichern

//... protocol implementieren ...

send_command[0]=0xFE;  //STX
send_command[1]=0x00;  //Data description
send_command[2]=u.v[0];  //floatbytes
send_command[3]=u.v[1];
send_command[4]=u.v[2];
send_command[5]=u.v[3];
send_command[6]=0xEF;  //ETX

//hier send_command[] ueber die serielle Schnittstelle schicken.
sendMyCommandToSerialPort();

Die Darstellung der bytes auf dem ATMEL Controllern ist little Endian,
auf den meisten PCs ebenfalls (Intel Procs). Die Darstellung muss
natuerlich auf uC und Rechner die gleiche sein sonst hauts nicht hin.

Link zu litte Endian:
http://de.wikipedia.org/wiki/Little_Endian

mg,
Johannes
Gast #288007
Lesenswert?
• ▲
▼
Meine Bedenken hatte ich mit den pointern wegen der Pointerarithmetik.
Ich war/bin mir nicht ganz sicher was passiert wenn man einen Pointer
auf eine Float-Variable zeigen laesst und dann inkrementiert... werden
die Speicherstellen dann um sizeof(unsigned char) oder um sizeof(float)
inkrementiert, das muss man ja manuell machen; bei der Union ist das
automatisch der Fall, dass die Variablen auf die gleiche Speicherzelle
zeigen und sie sind explizit dazu gedacht verschiedene Datentypen zu
speicher...

ich muss zugeben meine Freude an der Union zu haben, denn ich verwende
sie wirklich nur sehr sehr selten...

Kann sein, dass es auch mit deiner Methode funktioniert, ich wills
nicht bestreiten; ich  habs aber nicht probiert und getestet.

Danke jedenfalls fuer die Anregung.

mg,
Johannes
Gast #288009
Lesenswert?
• ▲
▼
wo ist das Problem?

@Johannes

nach dem cast auf unsigned char wird beim pointer++ nur um ein byte
weitergezäht. Mache das schon ewig so.. Funktioniert auch super mit
Strukturen oder dergleichen.

Schema ungefähr so...ohne sich mal Syntax zu halten

float x=1.234;
unsigend char p*;
unsigned char buffer[4];

p = (unsigned char) x;

buffer[0]= *p++;
buffer[1]= *p++;
buffer[2]= *p++;
buffer[3]= *p;

so ungefähr!
Gast #288010
Lesenswert?
• ▲
▼
Hallo,
hier ist ein Beispiel mit einem von mir getesteten C-Code im
Sinne des oben angegebenen Beispiels.
Viel Erfolg,
Stephan Rein

main(){
  printf("Welcome to the test program!\n");
  float a=4.2351894;
  unsigned char *p;
  p=(unsigned char*) &a;

  unsigned char ch[4];
  int i;
  for (i=0;i<4;i=i+1) ch[i]=p[i];

  float b;
  unsigned char *p2;
  p2=(unsigned char*) &b;
  for (i=0;i<4;i++) p2[i]=ch[i];

  printf("%f\n",b);
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.