Go Down

Topic: <solved> RF String zerlegen, brauche Hilfe (Read 983 times) previous topic - next topic

Cetax

Nov 28, 2013, 10:13 pm Last Edit: Nov 28, 2013, 11:39 pm by Cetax Reason: 1
Hallo allerseits,
ich experimentiere gerade mit einem 433MHz RF Modul und einem DHT11.
Ich empfange die Temperatur und die Luftfeuchtigkeit usw.  also senden und empfangen klappt.

ABER ich habe das gefühl man kann den STRING bestimmt einfacher zerlegen als ich das gemacht hab.

Hier der gesendete String:

Code: [Select]

 int humiINT = (int)humi;
 int tempINT = (int)temp;
 int vccINT  = (int)readVcc();

 snprintf(msg, 26, "s=%d&t=%d&h=%d&v=%d", SENSORID,tempINT,humiINT,vccINT) ;

 vw_send((uint8_t *)msg, strlen(msg));  // Daten per VirtualWire-Lib versenden
 vw_wait_tx();  // Auf kompletten Versandt warten


Und hier von der empfänger Seite:
Code: [Select]

void loop(){
 uint8_t buf[VW_MAX_MESSAGE_LEN];
 uint8_t buflen = VW_MAX_MESSAGE_LEN;

 // Daten-Variable, die die empfangenen Daten hält
 char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];

 // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
 String SensorData;
 String Sensor1;

 // Empfang von Daten prüfen
 if (vw_get_message(buf, &buflen)) {
   int i;
   memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1); // Das ganze Array mit 0en füllen

   
   // Datagramm zusammensetzen
   for (i = 0; i < buflen; i++) {
     SensorDataTemp[i] = (char)buf[i];
   }
   
   // Char-Variable terminieren
   SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';

   // Char to String-Konvertierung zur Übergabe an die connect()-Funktion
   SensorData = SensorDataTemp;
   
   // Serial-Output zum Debuggen
   Serial.println();
   Serial.print(F("Daten empfangen: "));
   Serial.print(SensorData);
   Serial.println();
 }
}


Und so sieht das aus, was da an kommt:

Code: [Select]
Daten empfangen: s=1&t=25&h=40&v=4537

s=1           <--SensorID
t=25        <--Temperatur
h=40      <--Luftfeuchte
v=4537  <--Volt

Und zerlegt habe ich das so:
Code: [Select]

   Serial.print(F("Temperatur: "));
   Serial.print(SensorData[6]);
   Serial.print(SensorData[7]);
   Serial.print(F("C "));
   Serial.println();

   Serial.print(F("Luftfeuchte: "));
   Serial.print(SensorData[11]);
   Serial.print(SensorData[12]);
   Serial.print(F("%"));
   Serial.println();


Ich hoffe ihr versteht mich  :smiley-red:
Ich möchte aus dem String also nur die Temperatur und die Luftfeuchte haben.

*greatz*

 CeTax

www dot blinkmann dot de

Serenifly

#1
Nov 28, 2013, 10:27 pm Last Edit: Nov 28, 2013, 10:36 pm by Serenifly Reason: 1
Was du mit snprintf() gemacht hast, gibt es auch zum Einlesen mit sscanf():
http://www.cplusplus.com/reference/cstdio/sscanf/

Du musst bei beiden Funktionen nur beachten, dass diese auf dem Arduino nicht mit Float funktionieren. Aber mit Integern geht es.

Code: [Select]

char str[] = "s=1&t=25&h=40&v=4537";
int temperature;
int humidity;

sscanf(str, "s=%*d&t=%d&h=%d&v=%*d", &temperature, &humidity);



EDIT:
Das musst du aber auf einen C-String/char Array anwenden! Mit den String Objekten geht das nicht. Du kannst aber wahrscheinlich einfach SensorDataTemp dazu nehmen.

Cetax

Hallo,
vielen Dank für deine Hilfe.
Also ich habe deinen Code einfach mal eingefügt und versucht zu verstehen...
Er funktioniert, ich bekomme die Temperatur und die Luftfeuchte angezeigt.

Aber verstehen tu ich es leider nicht.

Code: [Select]

char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];

int temperature;
int humidity;

sscanf(str, "s=%*d&t=%d&h=%d&v=%*d", &temperature, &humidity);


Woher weiß er das &temperature die Temperatur und &humidity die Luftfeuchte ist?

Und wenn ich nun die Voltzahl auch sehen möchte klappt das nicht ? Warum ?

Code: [Select]

    char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];
    int temperature;
    int humidity;
    int readVcc;

    sscanf(SensorDataTemp, "s=%*d&t=%d&h=%d&v=%*d", &temperature, &humidity, &readVcc);
   
    Serial.println(temperature);
    Serial.println(humidity);
    Serial.println(readVcc);
*greatz*

 CeTax

www dot blinkmann dot de

Cetax

Ok, ich habe einfach den * entfernt.
Jetzt klappt es...
Aber ob es das verstanden habe... Ich hoffe...
*greatz*

 CeTax

www dot blinkmann dot de

Serenifly

Der Stern bedeutet, dass die Zahl überlesen wird. Ich hatte einfach alle Zahlen mit %d markiert und an die zwei nicht benötigten einen Stern gemacht, damit man keinen Parameter dafür übergeben muss.

Siehe hier:
http://www.cplusplus.com/reference/cstdio/scanf/ (für die vollständige Liste aller Optionen)
http://de.wikibooks.org/wiki/C-Programmierung:_Einfache_Ein-_und_Ausgabe

Der Stern ist im ersten Link erklärt:
"An optional starting asterisk indicates that the data is to be read from the stream but ignored (i.e. it is not stored in the location pointed by an argument)."

Cetax

Super !! Dann habe ich das ja doch richtig verstanden.
Also vielen Dank für deine schenlle HIlfe und deine Eerklärung.

DANKE !!

Jetzt funzt erstmal alles so wie es soll... :D
*greatz*

 CeTax

www dot blinkmann dot de

Go Up