Hallo,
habe ein kleines Problem. Ich möchte eine PC anwedung schreiben, die Seriell daten an den Arduino sendet und Empfangen kann.
Beispiel. der Arduino hat in einer variable die Zahl 529.39
nun soll die als Zeichen Serial übertragen werden aber immer die gleiche Anzahl an zeichen.
Text[0] = "5"
Text[1] = "2"
Text[2] = "9"
//komma entfällt
Text[3] = "3"
Text[4] = "9"
habe ich nun die Zahl 29,01 sollte dies so aussehen
Text[0] = "0"
Text[1] = "2"
Text[2] = "9"
//komma entfällt
Text[3] = "0"
Text[4] = "1"
Von Zeichen in eine Zahl kann man ja "Rechnen" aber von Zahl in Zeichen steh ich auf dem schlauch 
Erst mal gibt es einen Unterschied zwischen doppelten und einzelnen Hochkomma. Ersteres ist ein String. Letzteres ist ein char.
Für die Wandlung von Gleitkommazahlen in C Strings und zurück gibt es folgende Funktionen:
atof (array to float):
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga689c9d3c4c04463aa31d329937789d06
dtostrf (double to string)
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42
Das ist was du willst!
Wie dtrostrf() funktioniert wird hier beschrieben:
http://www.mikrocontroller.net/topic/86391
Wenn du auf der Seite schaust, gibt es auch weitere Funktionen für die Wandlung von ints und longs. Zum Teil auch mit weiteren Optionen. Mit strtol/strtoul() z.B. kann man Binär und Hex-Strings in Zahlen wandeln. Anders herum gibt es ltoa/ultoa() um Strings mit anderen Basen zu erzeugen.
ok, werde ich mir mal durchlesen.
Evtl. habe ich mich etwas blöd augedrückt, Wichtig ist, dass der String der über der Serielle schnittstelle Wandert immer die gleiche länge hat. 102365 oder 000023 oder 002544
weil ich an bestimmten stellen, bestimmte werte dann erwarte .
Sorry, hatte ich etwas übersehen. dtostrf() hat einen width Parameter, aber ich glaube das füllt er nicht mit Nullen auf.
Da du auch das Komma entfernen willst, kannst du vielleicht den Float durch entsprechendes Multiplizieren erst mal in einen Integer wandeln. Also so oft mit 10 Multiplizieren wie Nachkommastellen da sind. Die Anzahl der Nachkommastellen kann man auch irgendwie berechnen.
Danach gibt es sprintf() um Zahlen auf eine konstante Länge zu formatieren (das geht auf dem Arduino nicht mit float direkt!!):
http://www.cplusplus.com/reference/cstdio/sprintf/
http://www.cplusplus.com/reference/cstdio/printf/
"%05d" z.B. formatiert einen Integer auf 5 Zeichen und füllt vorne mit Nullen auf. Mit Leerzeichen auffüllen ist auch möglich.
So wie kbl das im ersten Post schreibt, will er immer 5 Zeichen, wobei die letzten beiden immer die 2 Nachkommastellen sind.
Das heisst also
float x = 1.23 ; // Beispiel
unsigned int ix = x * 100; // -> 123
char buffer[6]; // Platz für 5 Zeichen
sprintf (buffer,"%05d", ix); // liefert "00123"
Serial.println(buffer);
fertig !
Im letzten Beitrag willst du immer 6 Zeichen mit führenden Nullen übertragen, da musst du das Beispiel oben natürlich an mehreren Stellen anpassen ( auch ein unsigned int ist dann sicher zu klein) ...
Ja, so. Ist halt die Frage ob die Anzahl der Nachkommastellen immer konstant ist. Wenn ja, ist es einfach.
EDIT:
dtostrf() fülllt links mit Leerzeichen auf. Man kann also solche Ausgaben bekommen:
3.56
43.56
843.56
hi michael,
ja sind nur beispiele, mir gehts halt um die 0 vorweg 
nachkommastellen wollte ich auf 2 nach dem komma beschränken 
werde mal mein glück nachher testen 
Serenifly:
Wenn ja, ist es einfach.
Wenn nein, wäre es noch schwieriger, einem Text wie "01234" anzusehen, was es bedeuten soll 
michael_x:
k-b-l:
ja sind nur beispiele, mir gehts halt um die 0 vorweg 
nachkommastellen wollte ich auf 2 nach dem komma beschränken 
- neg. Vorzeichen ?
- unsigned int geht nur bis 65535 und beim Multiplizieren kriegst du nie Fehler, nur Schrott-Egebnisse
wie meinst du das? nie fehler und nur schrott?
k-b-l:
wie meinst du das? nie fehler und nur schrott?
Du kannst mit integern rechnen wie du willst und kriegst immer ein Ergebnis.
Ob es das ist was du willst ( oder ob du es als Schrott siehst), hängt von dir ab:
void setup() {
Serial.begin(9600);
unsigned int i = 30000;
unsigned int i2 = 2*i;
Serial.println(i);
Serial.println(i2);
Serial.println(i*2);
Serial.println(i*3);
Serial.println(i*4);
}
void loop() {}