Hallo zusammen,
wie man der Überschrift bereits entnehmen kann habe ich ein Problem mit meinem Arduino Nano wenn ich zu viele Zeilen von der SD-Karte ausgelesen habe.
Aber erstmal zum Projekt:
Ich Bastel gerade für meine Firma ein Gerät, auf dem Via SD-Karte die Lagerplatznummern, und Kategorien von Gegenständen für das Lager gespeichert sind. Bis jetzt hat der gesamte Code auf reibungslos funktioniert. (Bin eigentlich auf bereits fertig)
Nun das Problem:
Als ich allerdings gestern angefangen habe die Daten auf der SD-Karte einzupflegen und die ersten Testläufe gemacht habe, habe ich festgestellt das wenn ich diese Daten dann auf dem I²C Display darstellen lasse, (Ich habe ein menü gebastelt, und dann wird je nach eingabe auf der SD-Karte verglichen ob die eingaben übereinstimmen, und die Lagerplatznummer wird dann ausgegeben).
Solange ich unter ca. 50 zeilen auf der SD-Karte belegt hatte ging auch alles, allerdings sobald es mehr wurden kam es dann zu Fehlern in der Anzeige und der Code ist auf einmal an Punkte gesprungen an die er von da aus gar nicht gehen darf/kann
Ich habe heute dann auch meine letzten 4 bösen Strings entfernt bekommen und habe sie gegen char arrays getauscht. Nun kann ich ca. 80 Zeilen einlesen bevor das Problem kommt.
Ich werden mal nur den Teil mit dem einlesen der Daten der SD-Karte Posten, da ich glaube keiner Lust hat meine gesamten 1300 Zeilen wild geschriebener Menü Strukturen zu durchforsten.
Ach ja. Daten auf der SD-Karte sind folgendermaßen formatiert: 1111/0000x0000
Die vier einsen am Anfang ändern sich je nach Menü Struktur. Will heißen wenn ich immer 3 Möglichkeiten zu Auswahl habe im Menü, symbolisiert die erste Zahl was ich gewählt habe, und die zweite Zahl was ich im Menü danach gewählt habe usw. Der Slash ist eig. nur für mich um es beim beschreiben einfacher zu machen. Der letzt teil ist eine Längenangabe in Millimeter, wobei das x auch wieder nur für mich ist.
Danach folgt immer in der nächsten Zeile so etwas: 1R013
Dies ist die Lagernummer, welche ich als char array einlesen und später auf die eigentlichen Bestandteile aufteile um sie besser im Display einzulesen.
Ich bin euch bereits für eure Hilfe dankbar
char line[LINE_DIM];
if (!sd.begin(chipSelect, SPI_FULL_SPEED)) sd.initErrorHalt(); //Startet mit dem lesen der SD-Karte
if (!file.open("Items.TXT", O_READ)); //Öfnnet die Datei "Items.txt"
while ((n = file.fgets(line, sizeof(line))) > 0 && result_zaehler < 2) //Liest solange neue Zeilen ein bis das Ende erreicht ist
{
Serial.print(line); //Zeigt die aktuelle Zeile an
if (strcmp(itemsuche, line) == 0)
{
Serial.print(F(" << Item gefunden"));
feedresult = true; //Setzt "feedresult" auf true, damit nun die Zeile darunter gesucht werden kann
}
if (feedresult == true) //Erhöht den Result Zähler damit die Zeile darunter gefunden werden kann
{ //(Verlässt die Schleife wenn ein bestimmter Wert erreicht ist)
result_zaehler++;
}
}
Serial.println(F("\nDone\n"));
lcd.setCursor(3, 0);
lcd.print(F("-Lagerposition-")); //Generiert die Überschrift von der Ergebnissanzeige
if (feedresult == false) //Wenn kein Ergebnis gefunden wurde wird der untenstehende Code aufgerufen
{
Serial.println(F("Kein Eintrag gefunden"));
lcd.setCursor(14, 1); lcd.print(F("./.")); //Gibt "Keine Angabe" Zeichen aus
lcd.setCursor(14, 2); lcd.print(F("./."));
lcd.setCursor(14, 3); lcd.print(F("./."));
}
if (feedresult == true) //Nur wenn ein Ergebnis gefunden wurde wird der untenstehende Code aufgerufen
{
Serial.print("Lagerplatz: ");
Serial.println(line); //Holt sich die Lagerplatznummer
lcd.setCursor(14, 1); lcd.print(line[0]); //Zeigt den Lagerplatz auf dem Display an
lcd.setCursor(15, 1); lcd.print(line[1]);
lcd.setCursor(14, 2); lcd.print(line[2]);
lcd.setCursor(15, 2); lcd.print(line[3]);
lcd.setCursor(15, 3); lcd.print(line[4]);
}
file.close(); //Die Datei auf der SD_Karte wird geschlossen
result_zaehler = 0; //Der Zähler um den Lagerplatz (-1 Zeile) zu finden wird zurückgesetzt
feedresult = false; //Der Zähler ob der Lagerplatz gefunden wurde wird zurückgesetzt
einmalig2 = true; //Setzt die Variable auf True damit dieser Code nur einmal ausgeführt wird
}