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]);
}
}
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!!!