Go Down

Topic: Char - String Operationen (Read 1 time) previous topic - next topic

mkl0815

atoi() und atof() kommen aus den Lib-C (bzw. aus dem Pendant für die AVRs: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html).
C-Strings müssen Null-Terminiert sein, also der Wert "0" (nicht das Zeichen '0' markieren das Ende eines Strings. Im Prinzip ist ein C-String ja nur ein array of char.

Durch das Ersetzen der "," durch  '\0' (also den Wert 0) "zerstückelst Du Deinen C-String (char-array) in einzelne Häppchen, die Du dann den Funktionen übergeben kannst. Aus

"12,34,01234,777.88" wird dann "12\034\001234\0777.88"
Der Zugriff erfolgt dann jeweils über einen Pointer auf das erste Zeichen des jeweiligen Teilstrings:
Code: [Select]

char buffer[19] = "12\034\001234\0777.88";

char* hour = &buffer[0];
char* minute = &buffer[3];
char* intvalue = &buffer[6];
char* floatvalue = &buffer[11];



Etwas komplizierter wird es, wenn die Kommas an unterschiedlichen Stellen auftauchen, also die Teilstrings unterschiedliche Längen haben können.

Ich weiss ja nicht, wie Du die Daten aus der Ethernetschnittstelle einliest, aber vielleicht kann man das ja schon beim Lesen parsen und in passende Variablen speichern.


hk007

Hi,
deine Idee ist prima. Klappt.
Da der String immer gleich gebaut ist, ist es einfacher:

Code: [Select]
  while (client.available()) {
  inbuf[i] = (client.read());
    if (inbuf[i] == 44) { // Kommas gegen "/0" tauschen
    inbuf[i] = 0;
    } 
  myserial.print(inbuf[i]);
  i=i+1;
  }
   char* day = &inbuf[4];
   char* month = &inbuf[7];
   char* year = &inbuf[10];
   char* hour = &inbuf[15];
   char* minute = &inbuf[18];

In Zahlen wandeln brauch ich eh nicht mehr, da ich die Werte auf SD-Karte speichere.

Jetzt hab ich nur noch ein Problem: Wie krieg ich aus 'hour' und 'minute' so etwas: "hh:mm"

Mit den Varianten läufts leider nicht:
Code: [Select]
String time;
time = (hour + ":" + minute);
time = (hour & ":" & minute);


Irgendwie bin ich mit den Stringoperationen auf Kriegsfuss.

gruß/hk007
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

mkl0815


Jetzt hab ich nur noch ein Problem: Wie krieg ich aus 'hour' und 'minute' so etwas: "hh:mm"

Der einfachste Weg wäre, das erste Komma gleich durch ein ":" zu ersetzen, dann ist

char* &buffer[0] (was übrigens dann das gleiche ist wie einfach nur buffer die Uhrzeit im Format "hh:mm".

Mario.

hk007

#8
Jul 17, 2012, 08:52 pm Last Edit: Jul 17, 2012, 08:59 pm by hk007 Reason: 1
Quote
Der einfachste Weg wäre, das erste Komma gleich durch ein ":" zu ersetzen

Ok...
gute Idee. Klappt aber nur, weil die beiden Strings nebeneinander stehen.

Gibts auch einen anderen Weg? Also einen String aus Teilstrings zusammensetzen?

EDIT:
got it:

Code: [Select]
String time;
time=(String(hour) + ":" + String(minute));
myserial.println (time); 


Gruß/hk007
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

hk007

Hi,
jetzt muss ich noch mal was nachschieben:

Ich hab da eine Ausgabe auf die serielle:
Code: [Select]
    myserialPC.print("Länge : ");
    myserialPC.print(float(var1)/100);
    myserialPC.println(" m");


Aber jetzt versuche ich schon seit Stunden dies in eine Zeile zu bekommen:
Das sind meine Ansätze:
Code: [Select]

myserialPC.print("Länge : " + float(var1)/100 + " m);
myserialPC.print("Länge : " + String(float(var1)/100) + " m);
myserialPC.print("Länge : " + char(float(var1)/100) + " m);


Alles leider nicht von Erfolg gekrönt :-(

gruß/hk007
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Go Up