moikka,
tarvitaan joku hyvä tapa, millä saisin luettua sd-kortilta .csv tiedoston annetteuihin muuttujiin.Esim. Ohjelmassa on muutujat TempOn,TempMin,TempMax.
SD-kortilla kirjoitettuna pilkulla erotettuna ensimmäisellä rivillä samat muutujan nimet kuin ohjelmassani ja toisella rivillä niiden arvot. esim.
1,-25,70. SD-kortin lukurutiini mulla on jo ja saan myös luettua arvot katkaistuna pilkkuun(strtok-funktio), mutta toi, miten saan sieltä TempOn muuttujan arvoksi tuon 1 jne...
SD-kortin sisältö:
TempOn,TempMin,TempMax
1,-25,70
sorsa on C:tä
saa myös laittaa postia mailiini
timo.kuisma@sci.fi
tiedoista kiitollisena
t. Timo
#include <stdio.h> // ... char teksti[] = "1,-25,70"; sscanf(teksti, "%d,%d,%d", &a, &b, &c);
moi,
Selvennän hiukka, mitä tarkoitan.
Tuo SD-kortin sisältö ei ole vakio, muulta osin kuin nimien osalta.
Nuo arvot ovat käyttäjältä annettavissa käyttöliittymän kautta.
Siis noita arvoja ei voi suoraan kirjoittaa koodiin, vaan ne haetaan SD-kortilta ja sitten pitää verrata koodissa olevaa muuttujaa SD-kortilla olevaan muuttujaan ja ottaa sen jälkeen sen arvo koodissa olevaan muuttujaan.
t Timo
Jos luet ne arvot tuohon teksti-muuttujaan ja sitten käytät tuota sscanf-funktiota? Tuohan asettaa muuttujiin a,b ja c nuo luvut. Sovella, sovella ;)
Moi,
Näin tein, mutta saan vaan tulokseksi pelkkää nollaa(0 0 0). Kääntäjä herjaa näin:
main.c(337): warning: #181-D: argument is incompatible with corresponding format string conversion
unsigned char buf[513]; BYTE TempOn; int TempMax; int TempMin; sscanf((char*)buf, "%d,%d,%d", &TempOn, &TempMin, &TempMax); rprintf("%d %d %d",TempOn,TempMin,TempMax);
tim16 kirjoitti:
Kääntäjä herjaa näin:
main.c(337): warning: #181-D: argument is incompatible with corresponding format string conversion
Yrität lukea kokonaisluvun (%d) BYTE-tyyppiseen muuttujaan (TempOn). Olettaen, että BYTE on char, oikea muunnosmerkki sille on %c
Mutta %c ei lue sitä lukuna vaan merkkinä. Lue siis ensin int-muuttujaan (&apuluku
) ja siirrä siitä (TempOn = apuluku
).
moi,
Jep toi pelas, mutta ongelmana on saada luettuna 'bufferista' vain kokonaisluvut. Ok bufferi sisältää hexana:
54 65 6D 70 4F 6E 2C 54 65 6D 70 4D 69 6E 2C 54 65 6D 70 4D61 78 0D 0A
31 2C 2D 32 35 2C 37 30 0D 0A 31 2C 2D 32 35 2C 37 30 0D 0A, eli
TempOn,TempMain,TempMax,1,-25,70
välilyönnit hexalukujen väleissä vain luettavuuden ymmärtämiseksi.
SD-kortin sisältö:
TempOn,TempMin,TempMax (rivi 1, aina samat)
1,-25,70 (rivi 2, muuttuu käyttäjän muutettua)
Nyt haluan vain saada luetuksi nuo kokonaisluvut tuolta bufferista.
Kysyn pitääkö minun lukea ensin tuo rivi 1 ja verrata niiden muuttujia ohjelmassa oleviin muuttujiin. Ja kun löytyy sama, niin sen jälken haetaan sitä vastaava arvo SD-kortista?
Nyt tulokseki tulee vain nollaa(0 0 0).
Kertokaa nyt olenko ihan metsässä vai muuten vaan en ymmärrä asiaa : )
t Timo
Selitäpä jotenkin ymmärrettävästi. Onko niillä ensimmäisen rivin teksteillä mitään merkitystä ohjelmasi kannalta? Jos ei, voit hypätä suoraan niiden yli.
moi,
No ei oikeastaan, koska rivi 1 pysyy aina samana. Riville tulee tietysti paljon enemmän muuttujia ja se oli mulla mielessä, että jos ne eivät ole aina samassa järjestyksessä, niin silloinhan rivillä 1 olisi myös merkitystä.
Mutta lähdetään nyt siitä, että rivi 1 pysyy vakiona aina. Eli SD-kortille kirjoitetaan käyttöliittymästä .CSV tiedosto pilkkuerottimena, joka sisältää esim. em. nimet ja muuttujien arvot. Rivi 1 siis vakio, ja rivi 2 muuttuu.
Miksi tämä antaa tulokseksi vain puhdasta nollaa?
sscanf((char*)buf, "%d,%d,%d", &TempHelp, &TempMin, &TempMax);
TempOn=TempHelp;
rprintf("%d %d %d",TempOn,TempMin,TempMax);
t Timo
Varmaankin siksi, että puskurissasi on ensin nuo turhat tekstit, jolloin lukeminen tyssää siihen. Etsi ensin toisen rivin alku ja lue vasta siitä kohti. Käsittääkseni myös tällaisen pitäisi toimia: sscanf((char*)buf, "%*s %d,%d,%d",
ja samat muuttujat yhä. %*s siis lukee yhden sanan (eli seuraavaan väliin tai rivinvaihtoon asti), ja * kertoo, ettei sitä tallenneta minnekään.
moi,
Jees tämä pelasi mainiosti. Oikein paljon kiitoksia, kun näin työväen juhlan aikaan sain näin hyvää apua.
Isot plussat auttajille : )
t Timo
Aihe on jo aika vanha, joten et voi enää vastata siihen.