PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unverständliche Konsolen-Anzeige



fredyxx
23.05.2016, 17:27
Hallo,

bitte in die Antwort nicht viel Zeit investieren, ich such selber noch. Aber evtl. fällt euch spontan was ein.
Der Code ist auch auf das Wesentliche gekürzt

Code:

float lzahn2;
float lzahn2_alt = 98; // Ausfahrlänge von Zahnstange 2 nach Justierung
float lzahn3;
float lzahn3_alt = 67; // Ausfahrlänge von Zahnstange 3 nach Justierung
float x1 = 344.67; // // Koordinaten von Punkt P1, den das Schaufelgelenk ansteuern soll
float y1 = 184.45; //
float W4;

void setup() {

Serial.begin (250000); // diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
while (!Serial);

}

void loop() {


Serial.print ("Drehwinkel2 = ");
Serial.println (Drehwinkel2_ber (),4); // Druckt Ergebnis des UPs mit 4 Stellen hinter dem Komma
Serial.print ("Drehwinkel3 = ");
Serial.println (Drehwinkel3_ber (),4); // Druckt Ergebnis von lzahn2 mit 4 Stellen hinter dem Komma
Serial.print ("lzahn2 = ");
Serial.println (lzahn2); // Druckt Ergebnis von lzahn2
Serial.print ("lzahn3 = ");
Serial.println (lzahn3); // Druckt Ergebnis von lzahn3

delay(2000);

}


// **************************************Unterprogram m Drehwinkel2_ber *******************************


int Drehwinkel2_ber ( ) {

// hier Berechnung von delta_lzahn2

int Drehwinkel2 = int(470.0 / 77.0 * delta_lzahn2);

Serial.print ("Klammer = ");
Serial.println (470.0 / 77.0 * delta_lzahn2); // Druckt Ergebnis von Klammer
Serial.println (Drehwinkel2); // Druckt Ergebnis von Drehwinkel2

delay(5000);
return Drehwinkel2; // die Ausgabe erfolgt in Grad

}


// **************************************Unterprogram m Drehwinkel3_ber *******************************


float Drehwinkel3_ber ( ) {


// hier Berechnung von lzahn3 und Drehwinkel3

int Drehwinkel3 = int(470.0 / 77.0 * delta_lzahn3);

return Drehwinkel3; // die Ausgabe erfolgt in mm

}





Auf der Konsole sehe ich dann sofort:

Drehwinkel2 = Klammer = 469.53
469 das ist nch ok

dann nach 5 s
13111 woher kommt die ?

Im Code sind die Befehle, die zu diesen Ausgaben führen fett

Gruß fredyxx

Sisor
23.05.2016, 19:09
13111 sollte das Ergebnis der Funktion 'Drehwinkel3_ber' sein.
int Drehwinkel3 = int(470.0 / 77.0 * delta_lzahn3); Wo ist das 'delta_lzahn3' definiert?

fredyxx
23.05.2016, 19:52
Sehr seltsam! Zunächst dachte ich, ich könnte den Fehler nicht wieder rekonstruieren, denn das Ergebnis entsprach genau meinen Erwartungen, nämlich:

Drehwinkel2 = Klammer = 469.53
469
469
Drehwinkel3 = 7.00
lzahn2 = 174.92
lzahn3 = 68.21

Dann habe ich noch mal verglichen wie der Code oben genau aussah und festgestellt, dass ich die Angabe der Stellen hinter dem Komma/Punkt in diesen Befehlen weggelassen hatte:

Serial.println (Drehwinkel2_ber (),4); und
Serial.println (Drehwinkel3_ber (),4);

Wenn ich die wieder eintrage, dann ist der Fehler wieder da; nämlich so wie oben

Drehwinkel2 = Klammer = 469.53
469
13111
Drehwinkel3 = 7.00
lzahn2 = 174.92
lzahn3 = 68.21

Dabei reicht es auch, wenn ich die Stelleangabe nur bei dem Druckbefehl für "Drehwinkel2_ber ()" eintrage.

Wenn nicht schon vorhanden, kann man bei so einem Fehler graue Haare bekommen.

Nun fällt mir auch eine Erklärung ein:
Ich erwarte von einer int-Zahl, dass sie Stellen hinter dem Komma hat; verleitet durch die Parallelrechnung in Excel

Danke und Gruß
fredyxx

HaWe
23.05.2016, 20:08
ich hätte da vlt einen Tipp -
aber vorher eine Frage: welchen Arduino hast du? einen Mega?

fredyxx
23.05.2016, 20:23
einen UNO für die Trockenversuche. Später einen MEGA

HaWe
23.05.2016, 20:37
ok, für einen Uno ist meine Lösung nicht geeignet, wohl aber für einen Mega.

Es geht um das unsägliche Serial.print mit seinen schauderhaften Formatiermöglichkeiten.

In C nutzt man für Ausgaben den sehr mächtigen Befehl printf(), wenn man direkt ausgeben will, bzw. sprintf(), wenn man die Ausgabezeile erst einmal in einen Puffer-String kopieren will.
Da eine direkte printf() Ausgabe bei Arduino Sketch nicht möglich ist, bleibt also nur sprintf(), und dann den Pufferstring per Serial.print (ohne weitere Formatierung).
Beide C-Funktionen nutzen ein 100% identisches Formatiersystem.

Aber:
Die schlauen Arduino-Entwickler haben die Float-Ausgabe für sprintf() bei AVRs unterbunden. Will man sie nutzen, kann man aber die lib patchen.

Das ist viel Aufwand und eine Menge Holz für einen Anfänger, und unsinnig für einen Uno, da zuwenig Speicher. Für einen Mega ist es den Aufwand aber wert.

Statt
Serial.print ("Drehwinkel2 = ");
Serial.println (Drehwinkel2_ber (),4);

hättest du dann
char sbuf[100]; // string buffer
sprintf(sbuf,"Drehwinkel2 = %.4f \n ", Drehwinkel2_ber () ); // sbuf zusammensetzen, evtl auch mit noch viel mehr Variablen und String-Bezeichnern
Serial.print(sbuf);


Das macht bei 1 string und 1 Variablen noch nicht viel aus, erleichtert aber erheblich die Formatierung bei komplexeren Aufgaben.

Wie gesagt, sehr mächtig, ein wenig aufwändig, aber anschließend höchst effizient, und du siehst leichter, welche Variablen evtl falsch formatiert wurden (int vs. float).
Hier ist die Beschreibung zu printf und sprintf:

http://www.cplusplus.com/reference/cstdio/printf/
http://www.cplusplus.com/reference/cstdio/sprintf/

Wenn es dich interessiert, poste ich dir auch den Link zum Float-Patch für den Mega.

botty
23.05.2016, 22:37
Ne andere Möglichkeit wäre erstmal Arduino beseite zu legen und sich einen freien Compiler und IDE zu installieren.
Im Moment geht es ja eher darum welche Daten Du hast und wie Du sie strukturieren kannst. Außerdem welche Operationen auf diese Daten nötig sind und wie sich beides in C(++) ausdrücken läßt, so daß Du ein Berechnungsmodul hast, welches sich dann auch in der Arduino Platform benutzen läßt.
Meiner Meinung nach ist das einfacher, denn wenn die Berechnung von Ein- und Ausgabe ordentlich getrennt ist, läßt sich das separat testen, da gibt's dann auch 'nen Debugger.

So'n Consolenprogramm dann in Header und C(PP)-File zu zerlegen und dem Arduino Sketch bezufügen ist dann einfacher als 'ne System-Lib zu patchen.
Im Moment geht's doch eher um's erlernen von C(++) und dann in weiteren Schritten den Spezifika der Arduino-Umgebung (ganz davon abgesehen das jeder Compiler-Upload-Lauf den µC unnötig 'verschleißt').

Meine 50ct

Gruß

Chris

P.S. Kannst Du bitte mal beide DrehwinkelBerechnungen komplett zeigen?!?

fredyxx
23.05.2016, 22:39
Danke für deine umfangreiche Info, aber z.Z. habe ich erst mal eine Menge anderer Probleme zu lösen.
Es ist aber trotzdem gut zu wissen, dass es sowas gibt.

Gruß
fredyxx

HaWe
23.05.2016, 22:43
@botty:
das stimmt so nicht: die besagte System lib zu patchen ist überhaupt kein Problem - im Gegensatz dazu, auf die Arduino IDE mit ihren ganzen Libs zu verzichten oder gar
ein Consolenprogramm in Header und C(PP)-File zu zerlegen und dem Arduino Sketch bezufügen, schon sehr.
Das Patchen hingegen ist ein einfacher Kopierbefehl - aber es macht nur mit einem Mega Sinn.

Ein Arduino Zero oder Due aber kann das alles bereits ohne jeden Patch, da klappt alles "von Haus aus".

aber ich verstehe, wenn man als Anfänger erst mal andere Probleme hat.

fredyxx
23.05.2016, 23:09
@botty:

Aber ich verstehe, wenn man als anfänger erst mal andere probleme hat.

danke!!!!!!