www.mikrocontroller.net

Forum: Compiler & IDEs double seriell übertragen


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei vom Controller Daten an den PC zu senden.

ich versuche es gerade mit folgenden Zeilen, bekomme aber die Meldung

invalid operands to binary >>

Die Meldung bezieht sich auf die Zeilen mit speeds[i]>>
Habe momentan keine Idee was ich falsch mache.

for (int i=0; i<4 ; i++) {
    speeds[i] = cpy_rad_sensoren[i] * 1.45301;

    tmp[0] = 'R';
    tmp[1] = i +'1';
    tmp[2] = (char)speeds[i];
    tmp[3] = (char)(speeds[i]>>8);
    tmp[4] = (char)(speeds[i]>>16);
    tmp[5] = (char)(speeds[i]>>24);
    tmp[6] = '\0';

    send_text(tmp);
}

Ihr könnt mir doch bestimmt helfen oder ? ;)

MfG
Marco

Autor: hugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder kann C nicht mehr als 8 Stellen shiften, (und) oder der >>
-Operator kann nicht auf doubles wirken.

Autor: aNIMALmOTHER (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
finde es raus: versuche erstmal einen double (wenn das überhaupt double
sind) zu shiften (schrittweise von einem shift bis zu 24 shifts). wenn
das klappt, dann versuche einen double aus einem array zu shiften. wenn
das klappt, dann versuche obs auch beim casting klappt.

aNIMALmOTHER

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Shift-Operatoren sind nur für Ganzzahldatentypen definiert.
Ein Shift von "double" oder "float" ist nicht möglich.

(unsaubere) Abhilfe: Typecast nach "unsigned long".

Das hilft aber nicht unbedingt; Du versuchst auf diese Art und Weise
einen String zusammenzustellen - wer aber garantiert Dir, daß die
einzelnen Bytes, aus denen sich der float-Wert zusammensetzt, nicht
versehentlich 0 sind, was das Stringende ankündigt?

Wenn Du float-Werte als Text übertragen willst, musst Du sie auch in
Text wandeln ...

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes habe ich bis jetzt festgestellt.

also mit einem long int funktionieren auch shifts größer als 8, bei
float und double nicht.

hab nun folgendes Konstrukt:

for (int i=0; i<4 ; i++) {
    speeds[i] = cpy_rad_sensoren[i] * 1.45301;

    p_tmp = &speeds[i];

    tmp[0] = 'R';
    tmp[1] = i +'1';
    tmp[2] = *p_tmp++;
    tmp[3] = *p_tmp++;
    tmp[4] = *p_tmp;
    tmp[5] = (char)*p_tmp;
    tmp[6] = '\0';

    send_text(tmp);
}

wobei p_tmp vom typ char* ist es gibt lediglich eine Warnung das
speeds[] und p_tmp nicht vom selben Pointertyp ist.

Ist zwar nicht sehr elegant und ob es funktioniert kann ich noch nicht
sagen.

MfG
Marco

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du versuchst auf diese Art und Weise
einen String zusammenzustellen - wer aber garantiert Dir, daß die
einzelnen Bytes, aus denen sich der float-Wert zusammensetzt, nicht
versehentlich 0 sind, was das Stringende ankündigt?

Guter Einwand, habe ich gar nicht dran gedacht. Dann schreibe ich die
Funktionen zum senden von text eben so um das Sie eine feste Anzahl
Zeichen sendet!

MfG
Marco

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Double und Float können keine Bitoperationen, da müsste der Compiler
aber mindestens 'ne Warnung ausgespuckt haben, oder?

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, versuch' doch per 'sizeof' die Länge der Variablen zu
ermitteln und damit den Outputstream zu füttern. So wird's auch beim
EEPROM-Beschreiben gemacht.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder wandle sie per sprintf o.dergl. (gibt es ftoa?) in eine String.

Autor: Feadi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch die Basis und den Exponent als byte übertragen, und die
Mantisse als long. Das ist aber für den Mensch nich so gut lesbar, für
den PC aber umsobesser. Und wenn Du der Basis einen festen Wert gibst
(z.B. 10), braucht Du den nicht zu übertragen.

Gruß, Feadi

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sonic
Der Compiler hat nicht nur eine Warnung, sondern gleich mit Fehlern um
sich geschmisen. Hatte ich aber auch geschrieben.
Hast du für deinen Vorschlag vielleicht ein wenig Code, damit ich mir
vorstellen kann wie du das genau meinst?

@inoffizeller WM-Rahul
Sowas wollte ich gerade vermeiden.

@Feadi
Das hört sich bis jetzt am besten an. Das sind ja dann sogar nur 3
Byte. Aber wie komme ich an Exponent und Mantisse?
Da am anderen ende der Leitung sowieso ein Programm hängt, ist es egal
ob das ganze für den Menschen leserlich ist.

Gäähn ... so und jetzt geh ich ins Bett.

MfG
Marco

Autor: Feadi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das steht hier: http://www.mpdvc.de/artikel/FloatingPoint.htm

Wenn µC und PC den double gleich abspeichern könnte das hier gehen:

double d;
uint8_t *tmp;
tmp = (uint8_t*) &d;

char buf[33];
sprintf( buf, "DOUBLE: %02x %02x %02x %02x %02x %02x %02x %02x \n",
 tmp[0], tmp[1], tmp[2], tmp[3], 
 tmp[4], tmp[5], tmp[6], tmp[7] );

serial_send( buf );


Gruß, Feadi

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So beschreibe ich das EEPROM z.B.:

eeprom_busy_wait(); 
eeprom_write_block(&Variable,(uint8_t*)2,sizeof(Preheat));

mit 'sizeof(...)' wird die Länge festgelegt,
mit '&Variable,(uint8_t*)2' die Variable mit Zeiger ab Adresse 2
gschrieben.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so: das Ganze verwendet die EEPROM-lib vom WINAVR.

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.