Ethernet(Wiznet) + SD kártya Megán
- 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
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]
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.
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!
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!
- vespapierre
- DrótVégénSzéndarab
- Hozzászólások: 37
- Csatlakozott: 2012. október 31. szerda, 6:00
pl. első lépésként cseréld le a kódodban:
helyett
vagy
(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.
helyett
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... /
Kód: Egész kijelölése
String vmi;
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);
}
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());
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()
* 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... /
- vespapierre
- DrótVégénSzéndarab
- Hozzászólások: 37
- Csatlakozott: 2012. október 31. szerda, 6:00
- vespapierre
- DrótVégénSzéndarab
- Hozzászólások: 37
- Csatlakozott: 2012. október 31. szerda, 6:00
Srejbi,
a esetén incompatible types in assignment of 'char*' to 'char [9]'
. Rosszul adtam meg az időt-el?
a
Kód: Egész kijelölése
sTime=rtc.formatTime();
. Rosszul adtam meg az időt
Kód: Egész kijelölése
char sTime[9] ="" ;
A hozzászólást 1 alkalommal szerkesztették, utoljára vespapierre 2012. november 17. szombat, 13:53-kor.
- vespapierre
- DrótVégénSzéndarab
- Hozzászólások: 37
- Csatlakozott: 2012. október 31. szerda, 6:00
Illetve a kártyára íráskor az alábbi datastring átalakítását hogy végezzem el?
itt is cseréljem le a Stringet? :
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();
Kód: Egész kijelölése
Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")");
vespapierre írta:Srejbi,
aesetén incompatible types in assignment of 'char*' to 'char [9]'Kód: Egész kijelölése
sTime=rtc.formatTime();
. Rosszul adtam meg az időt-el?Kód: Egész kijelölése
char sTime[9] ="" ;
mert mint írtam, másolni kell a karakterláncot:
Kód: Egész kijelölése
strcpy(sTime,rtc.formatTime());
vespapierre írta:Illetve a kártyára íráskor az alábbi datastring átalakítását hogy végezzem el?
itt is cseréljem le a Stringet? :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();
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!
- vespapierre
- DrótVégénSzéndarab
- Hozzászólások: 37
- Csatlakozott: 2012. október 31. szerda, 6:00
- vespapierre
- DrótVégénSzéndarab
- Hozzászólások: 37
- Csatlakozott: 2012. október 31. szerda, 6:00
Tisztelettel, ezt vitatnám.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.
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...).)
Ezzel egyetértek... (kivéve a fejlesztés sebességével, az inkább rutin kérdése...)Robert írta:Nagyon sok tesztelés és lassú fejlesztés szükséges. Oka, hogy az Arduino alatt nincs igazán debug rendszer....
- vespapierre
- DrótVégénSzéndarab
- Hozzászólások: 37
- Csatlakozott: 2012. október 31. szerda, 6:00
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!
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!