Ethernet(Wiznet) + SD kártya Megán

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Ethernet(Wiznet) + SD kártya Megán

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

Sziasztok,

gondjaim támadtak a sketch működésével. Thinsgpeakre küldök hőmérséklet értékeket + sd kártyára szeretnám kiírni.
Az induláskor minden ok. Az első adatküldés is megtörténik, szépen megy az SD írás...majd kb 2 perc után error opening datalog.txt ( nem nyitja meg a filet), az adatküldés másodikra már nem történik meg...
serial:
"SGetting temperatures...

Temperatures are 14 Celsius, 18 Celsius, 15 Celsius,

10:25:29 2012-11-17
cannot open datalog.txt
aGetting temperatures..."

txt:

4;16;13;2012-11-17;10:22:35;
4;16;13;2012-11-17;10:22:41;
4;16;13;2012-11-17;10:22:47;

mintha elvesztené az első karaktert....

Tudna valaki segíteni, hogy mi a bibi?

Itt a sketch[/url]
A hozzászólást 1 alkalommal szerkesztették, utoljára vespapierre 2012. november 20. kedd, 20:53-kor.
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

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

szerintem nem kéne Stringeket használnod...

inkább allokáld dinamikusan a karakterláncot, vagy deklarálj egy megfelelő méretű karaktertömböt.

miért is? -- http://code.google.com/p/arduino/issues/detail?id=857

üdv!
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

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

nincs túl nagy tapasztalatom arduino programozásban...a Thingspeaknek azt hiszem string-ként kell elküldenem a karakterláncot...
kezdő kérdés, de hogyan csináljam?
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

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

pl. első lépésként cseréld le a kódodban:

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

String vmi;
helyett

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

char vmi[256] = "";

vagy

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

char *vmi = malloc(sizeof(char)*256);
if (vmi) {
  ....
  free(vmi);
}
(a 256 egy légből kapott méret, számold ki esetenként mi a max hossz, és +1 ('\0'-nak))

ennek megfelelően mindenütt, ahol sztringművelet van, ott 'strcpy', 'strcat', stb.-t kell használnod (nem egyszerű értékadást).

pl.

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

String message = "";
message = String(rtc.formatDate(RTCC_DATE_ASIA)) + " " + String(rtc.formatTime());
helyett

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

char message[256] = "";
strcpy(message, rtc.formatDate(RTCC_DATE_ASIA));
strcat(message, " ");
strcat(message, rtc.formatTime());

// majd...

logFile.print("Progstart: "); 
logfile.println(message);
logFile.close()
Megjegyzések:
* nem ellenőriztem, de felteszem az 'rtc.formatTime()' visszatérési értéke 'char *' típusú...
* ellenőrzések elhanyagolva
* arról már nem beszélve, hogy a konstans stringeket célszerű progmem-be tenni... /főleg ha azt látod, hogy vészesen fogy a memória, ahogy nő a kódod terjedelme... ;) /
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

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

köszönöm, hogy segítesz! kipróbálom és jelzek!
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

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

Srejbi,

a

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

sTime=rtc.formatTime(); 
esetén incompatible types in assignment of 'char*' to 'char [9]'

. Rosszul adtam meg az időt

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

char sTime[9] ="" ; 
-el?
A hozzászólást 1 alkalommal szerkesztették, utoljára vespapierre 2012. november 17. szombat, 13:53-kor.
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

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

Illetve a kártyára íráskor az alábbi datastring átalakítását hogy végezzem el?

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

Serial.print(sTime);
  Serial.print(" ");
  Serial.print(sDate);
  Serial.println();
  dataString += String(String(temp0) + ";" + String(temp1) + ";" + (String)temp2 + ";" + sDate + ";" + sTime + ";");  
  delay(100);
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) 
  {
    dataFile.println(dataString);
// print to the serial port too:
    Serial.println(dataString);
  }  
  // if the file isn't open, pop up an error:
  else 
  {
    Serial.println("cannot open datalog.txt");
  } 
dataFile.close();
itt is cseréljem le a Stringet? :

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

Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")");
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

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

vespapierre írta:Srejbi,

a

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

sTime=rtc.formatTime(); 
esetén incompatible types in assignment of 'char*' to 'char [9]'

. Rosszul adtam meg az időt

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

char sTime[9] ="" ; 
-el?

mert mint írtam, másolni kell a karakterláncot:

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

strcpy(sTime,rtc.formatTime());
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

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

vespapierre írta:Illetve a kártyára íráskor az alábbi datastring átalakítását hogy végezzem el?

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

Serial.print(sTime);
  Serial.print(" ");
  Serial.print(sDate);
  Serial.println();
  dataString += String(String(temp0) + ";" + String(temp1) + ";" + (String)temp2 + ";" + sDate + ";" + sTime + ";");  
  delay(100);
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) 
  {
    dataFile.println(dataString);
// print to the serial port too:
    Serial.println(dataString);
  }  
  // if the file isn't open, pop up an error:
  else 
  {
    Serial.println("cannot open datalog.txt");
  } 
dataFile.close();
itt is cseréljem le a Stringet? :

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

Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")");

Az a lényeg, hogy a String objektumokat célszerű mellőzni a korábban hivatkozott AVR bug miatt.

Így aztán javaslom, hogy irtsd ki a kódodból és használd a hagyományos sztringeket, azaz char tömb, az értelmes karakterek végén '\0' terminálva (lásd C programozás alapjai).

Ha nem haragszol, nem írom át a kódodat, a lényeg, hogy 'String Változó' helyett 'char *Változó' (és malloc()-al allokálod a heap-en) vagy 'char Változó[tömbméret]' (és automatikusan foglalódik a stack-en).
Ha kezdő vagy C-ben, akkor inkább az utóbbit javaslom (nem kell figyelned az allokálás eredményére, illetve az allokált memória felszabadítására).

a '+' helyett strcat() -ot tudsz használni összefűzésre (de nem biztos, hogy kell, hiszen akár küldheted külön printekkel is az EthernetClient-re a sztringdarabokat...)
az '=' helyett strcpy()
a 'String(temp0)' helyett itoa() vagy dtostrf() -el tudod sztringbe konvertálni az integer vagy float típusú értékeidet.

(keress rá ezekre a függvényekre, olvasd el a leírásukat, stb.)

http://www.nongnu.org/avr-libc/user-man ... tdlib.html

http://www.nongnu.org/avr-libc/user-man ... tring.html

jó tanulást, sok sikert!
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

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

dehogy haragszom, inkább köszi a segítséget!
Közben az sTime ra rájöttem, hogy alap dolgot elcsesztem:)
Már olvasom is ami kell! :D
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

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

ok. akkor jó. :)

sajnos ennél részletesebben nincs időm foglalkozni a dologgal... de a két hivatkozott AVR library reference oldalon mindent megtalálsz, ami a String kiváltásához szükséges...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Fontos! Ezekkel az eljárásokkal kilépsz az Arduino keretrendszerből! Innentől a fejreállás kódolva van a rendszerben, mert az Arduino kerethatárokat átlépted.

Nagyon sok tesztelés és lassú fejlesztés szükséges. Oka, hogy az Arduino alatt nincs igazán debug rendszer....
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

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

fuu hát egyre jobbak a tanácsok :):):) belenyúltam a lecsóba..:)
de hát ha nincs más opció, hogy az int -ből char-t csináljak...:)
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

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

Robert írta:Fontos! Ezekkel az eljárásokkal kilépsz az Arduino keretrendszerből! Innentől a fejreállás kódolva van a rendszerben, mert az Arduino kerethatárokat átlépted.
Tisztelettel, ezt vitatnám.
A 'char' elemi C típus. A hivatkozott függvények részei a standard C függvénykönyvtáraknak.
Ha megnézzük az Arduino header fájlt, akkor a 4. és 5. sornál nem is nagyon kell lejjebb tekerni, mert ott vannak include-olva az AVR toolkitből.
A WString.cpp-t ha megnézzük (ahol implementálva van a kérdéses 'String' típus), az említett standard C függvények vannak használva gazdagon. Elég nehéz is lenne máskülönben (maradna a memcpy vagy iterálni a karaktertömbön és egyenként értékadni a tömbelemeknek...).)
Robert írta:Nagyon sok tesztelés és lassú fejlesztés szükséges. Oka, hogy az Arduino alatt nincs igazán debug rendszer....
Ezzel egyetértek... (kivéve a fejlesztés sebességével, az inkább rutin kérdése...)
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

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

hmm...megcsináltam, amit mondtál..de valamit elbaltázhattam...
hibaüzenetet nem kapok, viszont kb 10 bejegyzést készít a fileba és aztán többet nem. egyszer elküldi a szerver felé az adatot és többet nem...:(
A furcsa még mindig az, hogy a serial on néha a Getting temperatures előtt más más karakter jelenik meg...
kezdem feladni...
kicseréltem az előzőleg csatolt forrást, ha esetleg valakinek lenne kedve, kapacitása rápillantani, mit csesztem (cseszek ) el.

Jaa és a furcsa az, hogy a hőmérséklet értékeknél a dupláját tárolja el!!és küldi el először...

Köszi!
Válasz küldése