String konvertálás Integerbe probéma

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Bazs87
Biztosítékgyilkos
Hozzászólások: 62
Csatlakozott: 2014. július 20. vasárnap, 20:27

String konvertálás Integerbe probéma

HozzászólásSzerző: Bazs87 » 2015. július 19. vasárnap, 22:14

Sziasztok,

egy kezdetleges ethernet kommunikáció protokollját szeretném létrehozni, amihez mindenképp szükséges egy kis string faragás. Sajnos char-hoz nem állnak rendelkezésre megfelelő alap metódusok, ezért nem tudom a string változókat kiváltani.
Háttérstory: több ethernetes nano W5100on megadott szintax-szal küldözget hőmérsékletértékeket: <1_245> azaz homero 1, 24.5 fok, a szerverre bejövő értékeket szeretném eltárolni, itt akadtak a gondok, már odáig butítottam a rendszert, hogy soros portról olvasok be, és minden szépen checkolok, de lassan kezdem ledobni a szíjat, a logika jó, mégsem teszi azt amit kellene.
Elképzelhető, hogy a hivatalosan kiadott arduino library-k ennyire fapadosak???


a probléma röviden:
int isttemp[6]; //setupban -999-es értékekkel feltöltve
String s_msg=""; // a loopban lokálisan deklarálva
...
s_msg = Serial.readString(); // a beadott karaktersor: <1_245>
...
String num = s_msg.substring( s_msg.indexOf("<")+1 , s_msg.indexOf("_") );
String temp = s_msg.substring( s_msg.indexOf("_")+1 , s_msg.indexOf(">") );
...
int tmp_n = num.toInt();
int tmp_temp = temp.toInt();
...
isttemp[tmp_n]=tmp_temp;


az int alakítás még végbemegy, de az idexbe adott változót már nem érti, a tmp_temp érték is csak randomba olvasódik be, 90%-ban nem működik

a teljes tesztkód:

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

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(502);

boolean alreadyConnected = false; // whether or not the client was connected previously

int isttemp[6];


void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
 
  Serial.begin(9600);
 
  for (int i=0; i<6; i++){
    isttemp[i]=-999;
  }
}


void loop() {
  EthernetClient client = server.available();
  char msg;
  String s_msg="";
/* 
  if (client.available() > 0) {
   
    for (int i=0; i<6; i++) {
      msg = client.read();
      s_msg = s_msg + String(msg);
      delay(100);
    }
*/
  if( Serial.available() ) {
    s_msg = Serial.readString();

    // 1<245>
    //String num  = s_msg.charAt(0);
    //String temp =  s_msg.substring( s_msg.indexOf("<")+1 , s_msg.indexOf(">") );
    //<1_245>
    String num  = s_msg.substring( s_msg.indexOf("<")+1 , s_msg.indexOf("_") );
    String temp =  s_msg.substring( s_msg.indexOf("_")+1 , s_msg.indexOf(">") );

    Serial.print  (num);
    Serial.print  ("_");
   
    //Serial.print  (s_msg.indexOf("<"));
    //Serial.print  ("_");
    //Serial.print  (s_msg.indexOf(">"));
    //Serial.print  ("_");
    //Serial.print  (s_msg.substring(1+1,5));
    //Serial.print  ("_");
   
    Serial.println(temp);

    int tmp_n        = num.toInt();
    int tmp_temp     = temp.toInt();

    Serial.println(tmp_n);   
    Serial.print("-"); 
    Serial.println(tmp_temp);   

   
    //isttemp[tmp_n]=tmp_temp; - ez az ami nem megy, butább megoldás alul, az se jó
    switch (tmp_n) {
      case 0:
        isttemp[0]=tmp_temp;
        break;
      case 1:
        isttemp[1]=tmp_temp;
        break;
      case 2:
        isttemp[2]=tmp_temp;
        break;
      case 3:
        isttemp[3]=tmp_temp;
        break;
      case 4:
        isttemp[4]=tmp_temp;
        break;
      case 5:
        isttemp[5]=tmp_temp;
        break;
      case 6:
        isttemp[6]=tmp_temp;
        break;
    }

// ez mukodik
//    isttemp[0]=tmp_temp;
     
    for (int i=0; i<5; i++) {
      Serial.print(isttemp[0]);
      Serial.print("_");
    }
    Serial.println(isttemp[5]); 
  } 
}


kérlek segítsetek!
Remélem én követtem el valami kezdetleges és szembetűnő hibát. Ha van ötletetek a probléma megkerülésére azt is szívesen fogadom. A gond elvileg a dinamikus listába írással van, azt viszont nem értem miért. Az int az int, függetlenöl attól miből és hogyan olvassuk ki/alakítjuk át.

Köszi előre is!!!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9973
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: String konvertálás Integerbe probéma

HozzászólásSzerző: Robert » 2015. július 20. hétfő, 4:22

isttemp[6] - 6 elemű a tömb, azaz 0...5 indexálódik.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3310
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: String konvertálás Integerbe probéma

HozzászólásSzerző: kapu48 » 2015. július 20. hétfő, 9:34

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


// pointerek a tömbök elejére mutatnak = 0
 int tmp_n*        = num.toInt();
 int tmp_temp*     = temp.toInt();
 
 // A megcímzett elemeket mozgatjuk
 isttemp[*tmp_n]=*tmp_temp;
 // A pointereket növeljük
 tmp_n++;
 tmp_temp++;


Bazs87
Biztosítékgyilkos
Hozzászólások: 62
Csatlakozott: 2014. július 20. vasárnap, 20:27

Re: String konvertálás Integerbe probéma

HozzászólásSzerző: Bazs87 » 2015. július 26. vasárnap, 8:04

Köszönöm a válaszokat!

A probléma megoldása: az ellenőrző rutinban szereplő "isttemp[i]" helyett "isttemp[0]" volt. A rendszer tökéletesen működött, csak ez a trehány apróság vitt félre. Robert meglátása helyes volt, a switch csak egy teszt volt, a lényeg, hogy ez működik: isttemp[tmp_n]=tmp_temp;

kapu48 válasza érdekes, kérlek kifejtenéd a manipulálásod a * karakterrel? A char többdimenziós deklarálása kapcsán úgy hiszem megértettem, de itt nem áll össze a kép.

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

    // ellenorzo rutin
    for (int i=0; i<5; i++) {
      Serial.print(isttemp[i]);
      Serial.print("_");
    }
    Serial.println(isttemp[5]);


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég