Go Down

Topic: Text mit Textfinder einlesen (Read 6221 times) previous topic - next topic

-Micky

Wie kann ich mit dem Script Textfinder auch Text einlesen? Hier ein kurzer Auszug:

Code: [Select]
finder.find("<wind_dir");
    int R = finder.getValue();
    lcd.setCursor(11,0);
    lcd.print("R:");
    lcd.print(R);
    delay(3000);


Mit Zahlen funktioniert das zwar, nur nicht mit Text. Wind_dir sollte z.B. SSW, also die Wind Richtung ausgeben.


Micky

jurs


Mit Zahlen funktioniert das zwar, nur nicht mit Text.


Zum Suchen von Text müßtest Du ja wohl auch finder.getString() aufrufen und einen zusätzlichen post_string angeben, mit Text, der hinter dem gesuchten Wert steht. Siehe Library-Dokumentation:
http://playground.arduino.cc/Code/TextFinder
(Falls das der Textfinder ist, von dem Du hier gepostet hast.)

-Micky

Den Textfinder meine ich. Kannste mal bitte ein Beispiel schreiben? Ich versteh das nicht.

Micky

jurs


Den Textfinder meine ich. Kannste mal bitte ein Beispiel schreiben? Ich versteh das nicht.


Hast Du meinen Beitrag gelesen? Ich schrieb:
Quote

Zum Suchen von Text müßtest Du ja wohl auch finder.getString() aufrufen und einen zusätzlichen post_string angeben, mit Text, der hinter dem gesuchten Wert steht.


Deinen "post_string" möchtest Du nicht angeben?
Ist wohl geheim, oder was?

OK, den pre_string hast Du ja mit "<wind_dir" angegeben. Wenn der post_string so geheim ist, dass Du ihn nicht verraten kannst, dann rate ich jetzt mal, dass das vielleicht einfach ein Semikolon ";" sein könnte und die Windrichtung sei niemals länger als 5 Zeichen.

Ich kenne Deine Library zwar nicht, aber dann sollte das für einen eintreffenden Text mit dem Inhalt "abcdefg<wind_dirSSW;hijklmnop" ungefähr so funktionieren:
Code: [Select]

  char buf[6];  // Puffer deklarieren
  memset(buf,0,sizeof(buf)); // Puffer löschen
  int count=finder.getString("<wind_dir", ";", buf, sizeof(buf));
  if (count>0) Serial.println(buf); // das ist dann der Text zwischen "<wind_dir" und ";". 


-Micky

Danke! Hat funktioniert.

Was bitte ist ein post_string?!


Micky

jurs


Was bitte ist ein post_string?!


Das ist erstmal nur der Name einer Variablen in der Funktionsdeklaration.

Allerdings ein "sprechender" Variablenname.
Das lateinische Wort "post" bedeutet "nach".

D.h. wenn man einigermaßen raten kann und Latein in der Schule hatte oder englische pm-Zeitangaben (p.m.= post meridiem, nach dem Mittag) etwas sagen, dann ist "post_String" ein String "nach" dem gesuchten Text.

-Micky

Ah, danke.

Hatte nie Latein. Und mit AM und PM stehe ich auf Kriegsfuß. 


Micky

michael_x

Quote
mit AM und PM stehe ich auf Kriegsfuß

Das sollte dir keine Minderwertigkeitskomplexe verursachen.

Wer den Wechsel AM/PM zwischen 11 und 12 legt, die erste Stunde nach Mitternacht 12 nennt, und die nächste 1, dem ist wirklich nicht zu helfen.
Das Römische Reich ist nicht untergegangen, weil Obelix in den Zaubertrank gefallen ist, sondern weil die Lateiner nicht rechnen können. Ohne Null und wenn die Zahlen nur bis tausend gehen, kommt man nicht weit.

Und wo ich schon mal am Motzen bin:
Du kämst wohl auch weiter ohne StringFinder-Schnickschnack.
Bis man den verstanden hat, hat man sich das Benötigte selbst gebaut ( mit jurs' Hilfe allemal )
;)

uwefed


Das Römische Reich ist nicht untergegangen, weil Obelix in den Zaubertrank gefallen ist, sondern weil die Lateiner nicht rechnen können. Ohne Null und wenn die Zahlen nur bis tausend gehen, kommt man nicht weit.

Nur so zur Information die Römer konnten über 100o rechenen. Dazu gabs zB einen Strich über den Zeichen.
http://de.wikipedia.org/wiki/R%C3%B6mische_Zahlschrift#Gro.C3.9Fe_Zahlen
Aber ok das war nicht so flexibel wie binäre Zahlen die nur die Werte 1 oder 0 annehmen können.  ;) ;) ;)
Grüße Uwe

-Micky

Und wie bekommt man die "" rausgefiltert?

<cloudiness id="NN" percent="92.7"/>

Code: [Select]
int count1=finder.getString("percent=", "/>", buf, sizeof(buf));
    if (count1>0)


Ausgabe auf dem LCD Display ist dann: "92.7"


Micky

Serenifly

#10
Dec 25, 2013, 02:17 pm Last Edit: Dec 25, 2013, 02:22 pm by Serenifly Reason: 1
Das könnte gehen:
Code: [Select]
int count1=finder.getString("percent=\"", "\"/>", buf, sizeof(buf));

Du musst halt noch die Anführungszeichen hinzufügen und jeweils mit \ escapen



Sowas kann man eigentlich auch relativ einfach mit sscanf() machen:
http://www.cplusplus.com/reference/cstdio/sscanf/
http://www.cplusplus.com/reference/cstdio/scanf/

Auf dem Arduino hat man da das Problem, dass das für Float nicht implementiert ist. Es gibt zwar eine upgedatete Lib dafür, aber man kann es auch als String auslesen:

Code: [Select]

char str[] = "<cloudiness id=\"NN\" percent=\"92.7\"/>";
char buf[6];
sscanf(str, "%*[^0-9]%[.0-9]", buf);


Man liest alle Zeichen ein die nicht Zahlen sind (das ^ ist eine Negation). Und dann alle Zeichen die ein Punkt oder eine Zahl ist.
Der Stern bedeutet dabei, dass die Sequenz nicht in eine Variable geschrieben wird, sondern überlesen wird.

Falls bei "id=" mal eine Zahl drin stehen könnte, funktioniert dieser Format String:
"%*s%*s%*[^0-9]%[.0-9]"

-Micky

Die Version eins funktioniert sehr gut. Danke! Version zwei gibt keinen Wert zurück. Habe mehrere Varianten ausprobiert, klappt aber nicht.


Micky


Serenifly

Mhh, muss sagen dass es ich nur in Visual C++ getestet habe und nicht auf dem Arduino, aber das sollte eigentlich genauso gehen.

Naja. Du hast ja den TextFinder. Da muss man keine zweite Lib einfügen. Das vergrößert auch nur das Programm :)

-Micky

Ah ok. Geht einfach nicht.

Da hast Du recht. Mit dem Textfinder geht das auch. Obwohl ich die andere Version schöner finde.


Micky

-Micky

Habe eine stdinout.cpp gefunden. Funktioniert soweit so gut, nur wird der gesendete Wert nicht ausgegeben, sondern nur der voreingestellte.


Micky

Go Up