Problem z odczytem danych z karty SD do tablicy typu char - bu.tomasz - 06-01-2018
Witam, mam problem z odczytem danych z karty SD do tablicy typu char
dopisałem do programu odczyt z drugiego pliku do tablicy zmiennej char, aczkolwiek odczytuje tylko pierwszy znak. co robię nie tak, aby odczytywało całość linijkę do komórki tablicy?
{PS. tablica char dlatego, bo pierwsza tablica String ma 47 komórek a druga też by miała 49 komórek, co skutkuje zajęciem pamięci ram w 65% i źle odczytuje dane [Arduino Leonardo pro mini 2kb ram] na ATmega 644p 4kb ram działa prawidłowo przy dwóch tablicach String}
Plik key.txt:
Kod: KEY_M
KEY_SSTOP
KEY_TAB
KEY_1
KEY_2
KEY_3
KEY_4
KEY_5
KEY_6
KEY_7
KEY_8
KEY_9
KEY_0
KEY_DEL
MOD_CONTROL_LEFT
KEY_W
KEY_L
KEY_H
KEY_O
KEY_BACKSPACE
KEY_J
KEY_LEFT
KEY_RIGHT
KEY_UP
KEY_DOWN
KEY_I
KEY_SSTOP
KEY_PAGEUP
KEY_PAGEDOWN
KEY_PLAY
KEY_PAUSE
MOD_CONTROL_LEFT
KEY_T
KEY_R
KEY_F
KEY_S
KEY_REVERSE
KEY_FORWARD
KEY_N
KEY_E
KEY_ESC
KEY_BACKSLASH
KEY_A
KEY_T
KEY_Z
KEY_ENTER
KEY_HOME
KEY_C
KEY_U
Plik ir.txt:
Kod: 550720173
550707933
550750263
550760463
550744653
550732413
550748223
550716093
550740573
550756383
550724253
550742613
550758423
550726293
550754343
550738533
550722213
550763013
550729863
550714053
550746183
550756893
550740063
550748733
550731903
550723743
550719663
550752813
550712013
550728333
550718133
550701813
550709973
550734453
550727823
550744143
550750773
550717623
550733943
550760973
550758933
550742103
550725783
550721703
550705893
550738023
550715583
550735983
550703853
550754853
Kod programu:
Kod: #include <SPI.h>
#include <SD.h>
boolean stringComplete = false;
const int rozmiar_key = 47;
const int rozmiar_ir = 49;
String key[rozmiar_key];
char ir[rozmiar_ir];
char bufor = "";
int i = 0;
int a = 0;
File myFile;
File irFile;
void setup() {
Serial.begin(9600);
while (!Serial) {}
Serial.print("Inicjowanie karty SD...");
Serial.print("\n");
if (!SD.begin(8)) {
Serial.println("Inicjalizacja nieudana!");
return;
}
Serial.println("inicjalizacja zakonczona pomyslnie");
Serial.println("Otwieram plik: 'key.txt'");
myFile = SD.open("key.txt", FILE_READ);
if (myFile) {
while (myFile.available())
{
key[i] = myFile.readStringUntil('\n');
//Serial.println(key[i]);
i++;
}
myFile.close();
Serial.println("Zamykam plik: 'key.txt'");
} else {
Serial.println("Blad otwarcia pliku key.txt");
}
// wyjscie na serial
for (int d = 0; d < 48; d++) {
Serial.print(d);
Serial.print(" = ");
Serial.println(key[d]);
}
Serial.println("Otwieram plik: 'ir.txt'");
irFile = SD.open("ir.txt", FILE_READ);
i=0;
if (irFile) {
while (irFile.available())
{
bufor = irFile.read();
Serial.print(bufor);
ir[i] += bufor;
if (bufor == '\n') stringComplete = true;
if (stringComplete) {
Serial.print(ir[i]);
//Serial.print(bufor);
bufor = "";
i++;
stringComplete = false;
}
}
irFile.close();
Serial.println("zamykam plik: 'ir.txt'");
} else {
Serial.println("Blad otwarcia pliku ir.txt");
}
// wyjscie na serial
for (int x = 0; x < i; x++) {
Serial.print(x);
Serial.print(" = ");
Serial.println(ir[x]);
}
}
void loop() {
}
Sieral terminal:
Kod: Inicjowanie karty SD...
inicjalizacja zakonczona pomyslnie
Otwieram plik: 'key.txt'
Zamykam plik: 'key.txt'
0 = KEY_M
1 = KEY_SSTOP
2 = KEY_TAB
3 = KEY_1
4 = KEY_2
5 = KEY_3
6 = KEY_4
7 = KEY_5
8 = KEY_6
9 = KEY_7
10 = KEY_8
11 = KEY_9
12 = KEY_0
13 = KEY_DEL
14 = MOD_CONTROL_LEFT
15 = KEY_W
16 = KEY_L
17 = KEY_H
18 = KEY_O
19 = KEY_BACKSPACE
20 = KEY_J
21 = KEY_LEFT
22 = KEY_RIGHT
23 = KEY_UP
24 = KEY_DOWN
25 = KEY_I
26 = KEY_SSTOP
27 = KEY_PAGEUP
28 = KEY_PAGEDOWN
29 = KEY_PLAY
30 = KEY_PAUSE
31 = MOD_CONTROL_LEFT
32 = KEY_T
33 = KEY_R
34 = KEY_F
35 = KEY_S
36 = KEY_REVERSE
37 = KEY_FORWARD
38 = KEY_N
39 = KEY_E
40 = KEY_ESC
41 = KEY_BACKSLASH
42 = KEY_A
43 = KEY_T
44 = KEY_Z
45 = KEY_ENTER
46 = KEY_HOME
47 = KEY_C
Otwieram plik: 'ir.txt'
(Zmienna bufor)
550720173
⸮550707933
⸮550750263
⸮550760463
⸮550744653
⸮550732413
⸮550748223
⸮550716093
⸮550740573
⸮550756383
⸮550724253
⸮550742613
⸮550758423
⸮550726293
⸮550754343
⸮550738533
⸮550722213
⸮550763013
⸮550729863
⸮550714053
⸮550746183
⸮550756893
⸮550740063
⸮550748733
⸮550731903
⸮550723743
⸮550719663
⸮550752813
⸮550712013
⸮550728333
⸮550718133
⸮550701813
⸮550709973
⸮550734453
⸮550727823
⸮550744143
⸮550750773
⸮550717623
⸮550733943
⸮550760973
⸮550758933
⸮550742103
⸮550725783
⸮550721703
⸮550705893
⸮550738023
⸮550715583
⸮550735983
⸮550703853
⸮550754853zamykam plik: 'ir.txt'
Zmienna ir)
0 = ⸮
1 = ⸮
2 = ⸮
3 = ⸮
4 = ⸮
5 = ⸮
6 = ⸮
7 = ⸮
8 = ⸮
9 = ⸮
10 = ⸮
11 = ⸮
12 = ⸮
13 = ⸮
14 = ⸮
15 = ⸮
16 = ⸮
17 = ⸮
18 = ⸮
19 = ⸮
20 = ⸮
21 = ⸮
22 = ⸮
23 = ⸮
24 = ⸮
25 = ⸮
26 = ⸮
27 = ⸮
28 = ⸮
29 = ⸮
30 = ⸮
31 = ⸮
32 = ⸮
33 = ⸮
34 = ⸮
35 = ⸮
36 = ⸮
37 = ⸮
38 = ⸮
39 = ⸮
40 = ⸮
41 = ⸮
42 = ⸮
43 = ⸮
44 = ⸮
45 = ⸮
46 = ⸮
47 = ⸮
48 = ⸮
49 = f
50 =
Pomożecie?
Już wiem w czym problem, tablica char ir[x] nie przyjmuje wartości zmiennej bufor. Tylko czemu tak jest?
RE: Problem z odczytem danych z karty SD do tablicy typu char - kaczakat - 09-02-2018
Witam
Masz za mało ram, no przynajmniej na NANO jest za mało, Leonardo ma 500B więcej, dlatego dojeżdżasz aż do tego momentu. Nano mi klęka około 18 pozycji pliku key.txt.
To że po kompilacji pokazuje, że masz dostępne jeszcze 1kb nie znaczy, że to wystarczy na działanie programu. Jak łatwo sprawdzić, gdy tworzysz tablicę stringów jest rezerwowane na każdy element tablicy 6B, bo jest on tworem rezerwującym pamięć dynamicznie, jak zaczynasz do niej wpisywać kolejne literki to rozmiar zajętego ram rośnie, a niektóre linijki w pliku mają po 10 znaków. Nano rozjeżdża ram około 20 pozycji tego pliku czyli wczytaniu około 200B.
Leonardo da radę pewnie wczytać wszystkie i zostaje mu w tym momencie jakieś 200B. A jest drugi plik...
Nie możesz też zadeklarować tablicy char i oczekiwać, że tak oszukasz przeznaczenie. To jest obiekt jednowymiarowy posiadający 50 pol. Każde pole jest na jeden znak char. W każde pole po kolei nadpisujesz kolejny znak z linii pliku, kończąc znakiem NL (to pewnie te kwadraciki). I to on tylko tam jest. Potem przy odczycie ładnie ci to każde pole z powrotem odczytuje, oprócz ostatniego gdzie jest pewnie EndOfFile, eof, - f. Pewnie chodziło Ci o tablicę tablic 10 elementowych, tak by do każdego indeksu i wpisać literki pod indeksy j. No taka tablica zajęłaby 500B i od razu byś widział, że to nie zadziała. Akurat na te dane może być tablica jednowymiarowa, są tam ciągi cyfr, wystarczy zrobić tablicę elementów typu uint32_t, odczytać, przekonwertować na liczbę i taka tablica zajmie 4x50=200bajtów = 0RAM
A to jest tylko sekcja setup. Jeśli będziesz chciał robić jakieś operacje i wywoływać funkcje?
Jeśli chcesz mieć te kody używane w programie to można je zadeklarować i umieścić we flash procesora, wczytywać tylko potrzebne na daną chwilę. Będzie działać oczywiście wolniej.
Można też wywalić słowo KEY_, dodawać je gdy chcesz pokazać coś/gdzieś, pozostałe znaki ograniczyć do 4 i taka tablica dwuwymiarowa zajęłaby mniej niż tablica dynamicznych stringów. Czy zadziała zależy od reszty kodu.
|