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
Entweder kann C nicht mehr als 8 Stellen shiften, (und) oder der >> -Operator kann nicht auf doubles wirken.
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
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 ...
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
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
Double und Float können keine Bitoperationen, da müsste der Compiler aber mindestens 'ne Warnung ausgespuckt haben, oder?
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.
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
@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
Das steht hier: http://www.mpdvc.de/artikel/FloatingPoint.htm Wenn µC und PC den double gleich abspeichern könnte das hier gehen:
1 | double d; |
2 | uint8_t *tmp; |
3 | tmp = (uint8_t*) &d; |
4 | |
5 | char buf[33]; |
6 | sprintf( buf, "DOUBLE: %02x %02x %02x %02x %02x %02x %02x %02x \n", |
7 | tmp[0], tmp[1], tmp[2], tmp[3], |
8 | tmp[4], tmp[5], tmp[6], tmp[7] ); |
9 | |
10 | serial_send( buf ); |
Gruß, Feadi
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.
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.