String-ből integer-ek kiszedése

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

String-ből integer-ek kiszedése

Hozzászólás Szerző: Adamyno »

Újabb problémába ütköztem.

Olvasgattam könyveket, neten is keresgéltem de nem találtam megoldást az adott feladatra.
Mivel a soros portról érkező adatok (tudtommal) a stream osztályba tartoznak, ezért egy bejövő adatsorból csak egy feltétel alapján kereshetünk: Serial.find().
Viszont nekem van olyan adatsorom, hogy ha benne van az "up" vagy az "us=" rész, akkor egy változót 1-re kell állítani, majd az "us=" után következik 3-5 karakter hosszú szám, némi szöveg újra ("ds=") és megint egy 3-5 karakter hosszú szám.

Eddig a Serial.find("us=") után következő 2 számot a Serial.parseInt() parancs szedte ki 2 változóba, viszont muszáj volt úgy módosítanom a dolgokat, hogy a soros portról érkező adatokat soronként olvasom be egy string változóba, megvizsgálom a tartalmát, ha valami keresett rész benne van akkor végrehajtódik aminek kell, utána pedig várja a következő sort, ami majd ismét bekerül a string-be és ismét megvizsgáljuk, hogy van-e benne valami ami kell...

Ezzel 2 probléma lehet. Ha egyszerre kapok mondjuk 600 sor adatot, akkor szerintem az UNO nem fog tudni megbirkózni vele.
A másik pedig, a fenti probléma, hogy ha egy sorban a bejövő adat például "csatlakoztam, a sebességem felfele irányban= 567 lefele irányban= 32114"
akkor addig megvan, hogy beazonosítsam, hogy "csatlakoztam". Viszont még a 2 számot 2 integer változóba valahogy ki kellene szedni.

Kód: Egész kijelölése

String str = "";

 if (Serial.available() > 0) {
      str = Serial.readStringUntil('\r\n');
      if (str.substring(10,12) == "up")    Serial.println("ADSL connected UP");
}
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: String-ből integer-ek kiszedése

Hozzászólás Szerző: Adamyno »

Ilyeneket találtam, hogy isDigit(), indexOf(), substring(), readstring() /ez csak Serial esetén működik?/, atoi(), toInt().

Nem igazán tudom melyiket hogy lehetne felhasználni.
Talán a legígéretesebb ez lehet, de nem mindent értek meg angolul:http://stackoverflow.com/questions/1067 ... nge-values
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: String-ből integer-ek kiszedése

Hozzászólás Szerző: Adamyno »

Eddig jutottam, de nem működik:

Kód: Egész kijelölése

viod loop(){

if (Serial.available() > 0) {
      str = Serial.readStringUntil('\r');
      int str_len = str.length() + 1;
      char kar[str_len];
      str.toCharArray(kar, str_len);
      for (int i = 0; i < str_len; i++) {
       // if (kar[i] == 456 ) t = 1;
        while (kar[i] != 44){
        if (isDigit(kar[i])) {
          temp += (char)kar[i];
        }
        }
      }
      
      
      
      Serial.println(temp);
      str = ""; }
  
}
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: String-ből integer-ek kiszedése

Hozzászólás Szerző: kapu48 »

String to Int Function
http://www.arduino.cc/en/Tutorial/StringToIntExample

A számok keresésére jó az isDigit(string), átalakításra pedig a toInt függvények!
(Csak ki kel szedned a példából a Print-eket.)

Esetleg

Kód: Egész kijelölése

 // if you get a newline, print the string,
    // then the string's value:
    if (inChar == '\n') {
//Helyet szóköz a vége
 if (inChar == ' ') {
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: String-ből integer-ek kiszedése

Hozzászólás Szerző: Adamyno »

Kicsit másképp csináltam.
Az egésznek a lényege, hogy egy ilyen formájú üzenetre várok:
"ADSL link up, interleaved, us=639, ds=12470"

Kód: Egész kijelölése

if (str.substring(10,12) == "up") {     // Ha a beolvasott sorban találhatú "up" szó, akkor...
      
    display.fillRect(0, 16, 128, 48, BLACK); //Szovegmezo torlese a kepernyon
    display.setTextColor(WHITE);              //szovegszin
    
  /*  display.setTextSize(1);
    display.setCursor(0,16);
    display.print(str); */
    
    display.setTextSize(2);                     //betumeret
    display.setCursor(48,16);                 //kurzor pozicio
    display.print(F("OK"));                      /kiiras a képernyore
    display.setCursor(6,32);                  
    display.print(F("CONNECTED"));
    display.display();                             //képernyobuffer megjelenitese
    
      int downegyenlo;                    // innen kezdődik az értékek keresése
      String us;
      String ds;
      
      int str_len = str.length() + 1;
      char kar[str_len];
      char upkar[str_len - 30];
      str.toCharArray(kar, str_len);
      
      for (int i = 30; i < str_len; i++) {   //mivel a 30. karaktertől kezdődik az Upstream érték, ezért csak innen foglalkozunk a szöveggel, a többi része statikus. Átpörgetjük másik tömbbe
        upkar[i-30] = kar[i];     //átmentem az upstream-el kezdve
        if (kar[i] == 61 ) {
         downegyenlo = i;        // ez lesz az egyenlosegjel helye
       }
       
        if (isDigit(kar[i])) {
          temp += (char)kar[i];
        }
      }
      
      for (int i = 0; i < ((downegyenlo)-30); i++) {  //kiszedjük az upstream értéket
         if (isDigit(upkar[i])) {
          us += (char)upkar[i];
        }
     }
     
     
     
     for (int i = (downegyenlo+1); i < str_len; i++) {     //kiszedjük a downstream értéket     
        if (isDigit(kar[i])) {
          ds += (char)kar[i];
        }
      }
      
      
      Serial.print(F("Upstream: "));
      Serial.println(us.toInt());
      Serial.print(F("Downstream: "));
      Serial.println(ds.toInt());
      
      UPSTREAM = us.toInt();
      DOWNSTREAM = ds.toInt();
      
      str = ""; 
    
    
    }
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: String-ből integer-ek kiszedése

Hozzászólás Szerző: kapu48 »

Ezt a sort feleslegesnek találom!

Kód: Egész kijelölése

upkar[i-30] = kar[i];     //átmentem az upstream-el kezdve
Minek? Használod majd valahol az upkar stringet?
Elég lenne csak megkeresni az ’=’ jelet.
Adamyno
DrótVégénSzéndarab
Hozzászólások: 35
Csatlakozott: 2015. április 16. csütörtök, 19:29

Re: String-ből integer-ek kiszedése

Hozzászólás Szerző: Adamyno »

Igen, az elején így a feltöltési értékkel kezdődik, amit beolvasok, elmentek egy változóba de csak a következő egyenlőségjelig olvasom!
Utána külön beolvasom a maradékot, ami az egynlőségjel után van, tehát a letöltési sebességet.

Ha egyszere olvasom be mindegyiket, akkor egy hosszú szám lesz belőle és az nem jó, mert a feltöltés is lehet normál esetben 3-4 jegyű, a letöltés pedig 4-5 jegyű szám és másképp nem tudnám megkülönböztetni (legalábbis nem jöttem rá hogyan, ez a módszer jutott eszembe).
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: String-ből integer-ek kiszedése

Hozzászólás Szerző: kukuri »

kapu48 írta:Ezt a sort feleslegesnek találom!

Kód: Egész kijelölése

upkar[i-30] = kar[i];     //átmentem az upstream-el kezdve
Minek? Használod majd valahol az upkar stringet?
Elég lenne csak megkeresni az ’=’ jelet.
Szerintem én is ezen az úton kezdeném a megoldást. Szét kell daraboltatni a szöveget minden = jelnél. Utána karakterenként átmásolnám egy másik sztringbe az értékeket egészen addig ameddig számot tartalmaz. Utána már csak át kell konvertálni a megfelelő formátumra.
Válasz küldése