Pages: [1]   Go Down
Author Topic: Char - String Operationen  (Read 1256 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
brauch mal wieder eure Hilfe. Steh momentan voll auf dem Schlauch smiley-sad

Ich bekomme über die Ethernet-Schnittstelle folgende Sequenz "12,34,01234,777.88"
Die ersten beiden Zahlen stellen Stunden und Minuten dar. Die will ich so erfassen, daß ich einen String mit 12:34 bekomme.
Die dritte Zahl ist einen Integer Wert darstellen. Die vierte ein float.
Ich habe jetzt alles mal als Byte-Array eingelesen. Schlau oder nicht, sei mal dahingestellt. Ich bekomme dann input
  • . (x=0...17)

Aber jetzt gehts los. Die integer Zahl zu errechnen geht ja noch: input[6]*10000 + input[7]*1000 + input[8]*100 + input[9]*10 + input[10]*1
Bei dem String bröselts mich schon. Mit Timestring = (char(input[0]) + char(input[1]) + ":" + char(input[3]) + char(input[4])); kommt alles mögliche raus. Nur nicht das gewünschte.
Und beim float-Wert: Keine Ahnung.

Ist vllt. ein byte-Array nicht die schlaueste Lösung? Aber mit einem char-Array wirds doch auch nicht besser....

Gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Edison Member
*
Karma: 21
Posts: 1405
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dazu erstmal eine Frage. Wie werden die Daten gesendet?
Also tatsächlich als String, oder als tatsächliche Werte?
Gemeint ist folgendes: (Beispiel Uhrzeit)
1) Es werden die Zeichen  '1' '2' ',' '3' '4' gesendet, das wären dann die Byte-Werte 49,50,44,51,52
2) Es werden die Bytewerte gesendet, also 1,2,',',3,4

Dein  Beispiel mit dem Integer legt nahe, das Du die einzelnen Ziffern als jeweiligen Byte-Wert, nicht als Zeichen sendest, sonst würde nämlich bei input[6]*10000 + input[7]*1000 + input[8]*100 + input[9]*10 + input[10]*1 Blödsinn rauskommen. Dann wäre es bei der Uhrzeit aber auch (char(input[0]+49) + char(input[1]+49) + ":" + char(input[3]+49) + char(input[4]+49)).
Mario.
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

oh oh, da hab ich des Nächtens doch wieder mal Äpfel mit Birnen vermischt  (schäm)
Die Werte kommen ja schon als Charakter. Wenn ich mich per Console (Telnet) auf den Ethernet-Teilnehmer schalte, dann seh ich genau das: "12,34,01234,777.88"
Du hast recht. Die Berechnung für den Integer kann so (wie ich geschrieben habe nicht klappen). Aber das war sowieso erst mal Gedankengut und noch kein Programmcode.
Ich bin schon an dem Uhrzeitstring verzweifelt.

Aber irgendwie ist es dann doch doof, Charakter als Byte einzulesen.
Muss mir das unter den neuen Erkenntnissen abends noch mal genauer anschauen.

Aber wie ich die Gleitkommazahl umsetzen soll?????

gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Edison Member
*
Karma: 21
Posts: 1405
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ob Du nun char oder byte einliest, macht keinen Unterschied. Die Daten bleiben ja trotzdem die gleichen.

Schau Dir mal die Funktionen atoi() und atof() an, die wandeln Strings in Integer und Float um. Wenn der String immer gleich groß ist, also die Trenner (,) immer an der gleichen Stelle sind, könntest Du Dir jeweils den Anfang (erstes Zeichen) des Integer und des Float merken, die "," jeweils durch '\0' ersetzen und dann atoi() und atof() jeweils mit den Zeigern auf die Anfangszeichen füttern.
Mario.
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi mkl0815,

danke für den Schubs.
Ich werd mir die beiden Befehle mal anschauen. Wieso stehen die eigentlich nicht in der Referenz? Dann hätte ich die ja auch finden können.
Oder brauch ich da ne extra library dazu?

Was bringt das mit dem '\0' ?

Gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Edison Member
*
Karma: 21
Posts: 1405
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.

Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
  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:
String time;
 time = (hour + ":" + minute);
 time = (hour & ":" & minute);

Irgendwie bin ich mit den Stringoperationen auf Kriegsfuss.

gruß/hk007
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Edison Member
*
Karma: 21
Posts: 1405
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
String time;
time=(String(hour) + ":" + String(minute));
myserial.println (time); 

Gruß/hk007
« Last Edit: July 17, 2012, 01:59:02 pm by hk007 » Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
jetzt muss ich noch mal was nachschieben:

Ich hab da eine Ausgabe auf die serielle:
Code:
    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:
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
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Pages: [1]   Go Up
Jump to: