• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z odczytem danych z karty SD do tablicy typu char
#1
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?
 
Odpowiedź
#2
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości