2017-02-04 8 views
1

Ich versuche, Text in einer Datei auf einer SD-Karte gespeichert anzuzeigen. Ich kann die erste Zeile bis zur 2. bis zur letzten Zeile lesen. Wenn ich jedoch versuche, die letzte Zeile zu lesen, hört das Programm auf zu laufen und das LCD zeigt alle weißen Quadrate an. Was mache ich hier falsch?Arduino SD-Karte lesen letzte Zeile

myFile.seek(0); 
char cr; 
for(unsigned int i = 0; i < 15;){ 
cr = myFile.read(); 
    if(cr == '\n') 
    { 
     i++; 
    } 
} 
while(true){ 
    cr = myFile.read(); 
    if((cr == '\n')||(cr == '\r')) 
     break; 
    lcd.print(cr); 
} 

Dies ist der Inhalt der Datei:

1. 00.1 
2. SUN 
3. 00.00.0001 
4. 00:00:01 
5. 00.2 
6. MON 
7. 00.00.0002 
8. 00:00:02 
9. 00.3 
10. WED 
11. 00.00.0003 
12. 00:00:03 
13. 00.4 
14. THU 
15. 00.00.0004 
16. 00:00:04 
+1

sieht aus wie dieser Code 15 Zeilen liest, dann eine 16 liest und schreibt sie in den lcd. Da wir nicht wissen, was in dieser 16. Zeile steht, wird es schwer sein, dir zu helfen. Ich sehe dort nichts, was offensichtlich fatal ist, aber du solltest die Lektüre für den Erfolg überprüfen, damit du weißt, dass du zumindest etwas liest und über 'std :: getline 'nachdenkst. – user4581301

+0

korrigieren Sie mich, wenn ich falsch bin. In der Datei sind 16 Zeilen geschrieben. von Zeile 0 bis Zeile 15, die insgesamt 16 Zeilen ergibt? – bembe24

+0

also sagen wir, die letzte Zeile ist "20" geschrieben. 20 wird die 16. Zeile oder Zeilennummer 15 ?? habe ich recht? – bembe24

Antwort

0

hier:

while(true){ 
     cr = myFile.read(); 
     if((cr == '\n')||(cr == '\r')) 
      break; 
     lcd.print(cr); 
    } 

Sie haben einige Code, der lesen soll, und drucken, werden alle Zeichen auf der 16. Zeile Ihres datei und stop, wenn ein newline Zeichen gefunden wird.

Es sieht akzeptabel, aber was ist, wenn die 16. Zeile ist nicht von \n oder \r beendet?

Die documentation von read() sagt, dass diese Funktion -1 zurückgibt, wenn es keine Daten verfügbar sind. Klar, wenn die Datei ohne newline endet, wird genau das passieren. So jetzt sind Sie stecken in einer Schleife, in der Sie -1 endlos lesen, aber warum sehen Sie diese weißen Blöcke auf dem Bildschirm?

Mal sehen. lcd.print(char) von class Print geerbt und es contains den folgenden Code:

size_t Print::print(char c) 
{ 
    return write(c); 
} 

innen Print.h wird Print::write(uint8_t) erklärt ein rein virtuelle Methode, zu sein, was bedeutet, dass seine Umsetzung kann in einem seiner Unterklassen gefunden werden in diesem Fall LiquidCrystal.cpp:

inline size_t LiquidCrystal::write(uint8_t value) { 
    send(value, HIGH); 
    return 1; // assume sucess 
} 

Jetzt finden wir heraus, dass die ursprünglichen -1 vom Typ char, die alscodiert wird, 0, wird als 255 vom Typ uint8_t interpretiert. Ein kurzer Blick auf der folgenden Tabelle

enter image description here

zeigt, dass 255 (letzte Spalte, letzte Zeile) auf ein volles schwarzes Quadrat entspricht.

Ok, wir sind fast da, nur dass Sie weiße Quadrate statt schwarze Quadrate sehen. In diesem Zusammenhang sollte darauf hingewiesen werden, dass Ihr Code ist kontinuierlich, und ohne keine Verzögerung, Drucksachen auf die lcd. So ist es wahrscheinlich, dass der LCD-Bildschirm bleibt aktualisiert(und sein Inhalt möglicherweise verschoben?), so dass die schwarzen Blöcke erscheinen weißer als sie wirklich sind.


TL; DR Lösung:

while(true){ 
     cr = myFile.read(); 
     if((cr == '\n')||(cr == '\r') || (cr < 0)) 
      break; 
     lcd.print(cr); 
    } 
+0

Danke soooo viel !! Es funktionierte!! Ich war immer noch verwirrt, wie '\ n' und '\ r' im Code verwendet wurden. – bembe24

+0

@ bembe24 du bist willkommen –