SD-Karte: Aus einer .txt datei werte in ein int Array einlesen

Hallo,

ich habe auch meiner SD Karte eine Textdatei, in der steht:
0x7F89009A
0x7956A08F
.
.
.
.
.
0x7B547A8C

ich würde nun gerne jede Linie der Textdatei in ein Feld einlesen.
das es nacher im array so abgespeicehr ist: int array[] = {0x7F89009A, 0x7956A08F ....... ,0x7B547A8C};

ich freue mich auf eure Antworten

Mit freundlichen Grüßen

das passt nicht in ein int!

Da heutzutage nicht mehr sicher ist, was ein "Arduino" ist, kann man das so nicht sagen
Für 0x7F89009A würde ich jedenfalls ein [b]int32_t[/b] vorsehen.

Das Einlesen von einer SD Karte unterscheidet sich praktisch nicht vom Einlesen von der seriellen Schnittstelle. Nur das Zeitverhalten ist anders. Ansonsten geht das mit den gleichen Funktionen/Methoden

Die Arduino Methoden dazu findet man in der Stream Klasse

Aktuell nutze ich die ReadWrite:

#include <SPI.h>
#include <SD.h>
File myFile;
int c[10];
void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT); 
  if (!SD.begin(BUILTIN_SDCARD)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("test.txt" , FILE_READ);
  if (myFile) {
    Serial.println("test.txt:");
    int i = 0;
    while (myFile.available()) {
      c [i] = myFile.parseInt();
      i++;
    }
    // Als Überprüfung ob das einlesen in das Array Funktioniert hat
    for(int j = 0; j<10 ; j++){
      Serial.println(c[j]);
    }
    Serial.println("Fertig");
    myFile.close();
  } 
  else {
    Serial.println("error opening test.txt");
  }
}
void loop()
{
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Außerdem entferne bitte die unnötigen Leerzeilen.

Gruß Tommy

... bis jetzt ist Nichts in dem Sketch, was ein Uno/Nano stören würde - also doch in die Richtung (u)int32_t ...

MfG

Also ich glaube nicht, dass das macht, was Du denkst:

c [i] = myFile.parseInt();

Ich würde die Zeile zeichenweise in ein Char-Array einlesen, bis zum Zeilenvorschub und den mit '\0' om Array ersetzen. Die Einleseroutine gibt es hier im Forum mehrfach. Dann mit strtoul in einen unsigned Long wandeln.

Gruß Tommy

Das geht schon. Einmal. parseInt() bricht ab wenn das CR kommt. Aber das muss man ja auch irgendwie auslesen (und das LF danach). Und was wird da nicht gemacht

readBytesUntil() mit einem LF an Endzeichen geht hier auch.

Seit wann kann parseInt Hex einlesen?

Gruß Tommy

Oh. Oops. Ja mit Hex geht das natürlich nicht :confused:

Tommy56:
Also ich glaube nicht, dass das macht, was Du denkst:

c [i] = myFile.parseInt();

Ich würde die Zeile zeichenweise in ein Char-Array einlesen, bis zum Zeilenvorschub und den mit '\0' om Array ersetzen. Die Einleseroutine gibt es hier im Forum mehrfach. Dann mit strtoul in einen unsigned Long wandeln.

Gruß Tommy

Danke für eure Hilfe

So sieht mein aktueller Code aus

#include <SPI.h>
#include <SD.h>
File myFile;
char c[60];
void setup()
{
  for(int k = 0; k<60; k++){
    c[k]= '0';
}
  Serial.begin(9600);
   while (!Serial) {
    ; 
  }
  
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
   
  if (!SD.begin(BUILTIN_SDCARD)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("test.txt" , FILE_READ);
  if (myFile) {
    Serial.println("test.txt:");
    int i = 0;
    while (myFile.available()) {
      char tem = myFile.read();
      byte temp = tem;
      if (temp == 10){ 
        c[i] = '\0';
        i++;
      }
      else if (temp == 13){
      }
      else{
        c[i] = tem;
        i++;
      }
    }
    // Als Überprüfung ob das einlesen in das Array Funktioniert hat
    for(int j = 0; j<60; j++){
      Serial.println(c[j]);
    }
    Serial.println("Fertig");
    myFile.close();
  } 
  else {
    Serial.println("error opening test.txt");
  }
}
void loop()
{
}

Ich hoffe ich hab das mit dem einlesen in das char richtig gemacht. Aber das umwandeln mit strtoul in unsigned long hab ich bis jetzt noch nicht hinbekommen.

Mach mal:

// ohne 0x davor
unsigned long ul = strtoul (c, NULL, 16);
// oder wenn 0x davor steht
unsigned long ul = strtoul (c+2, NULL, 16);

Serial.println(ul,HEX);

Warum machst Du c so lang? Anzahl Nutzzeichen+1 genügt.

Gruß Tommy

Also das abspeicher der ersten Zeile in long funktioniert perfekt.
Aber ich habe ja mehr als eine Zeile, wie speichere ich die ab?
Am besten wäre es wenn ich es in ein array abspeicher könnte.

Na wenn Du den Long hast, was hindert Dich daran, den ins Array zu schreiben und dann die nächste Zeile zu lesen, solange was da ist.

Gruß Tommy

Mit welchem befehl spring ich in die nächste zeile?

Wenn Du eine Zeile komplett gelesen hast, stehst Du am Anfang der nächsten Zeile, wenn noch was da ist.

Gruß Tommy

Also aktuell speicher er mir nur die erste Zeile in den ganzen Arrays...

#include <SPI.h>
#include <SD.h>
#include <IRremote.h>
IRsend irsend;
File myFile;
char c[51];
unsigned long ul;
unsigned long lon[10];
void setup()
{
  for(int k = 0; k<60; k++){
    c[k]= '0';
  }
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
   
  if (!SD.begin(BUILTIN_SDCARD)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("test.txt" , FILE_READ);
  if (myFile) {
    Serial.println("test.txt:");
    int i = 0;
    while (myFile.available()) {
      char tem = myFile.read();
      byte temp = tem;
      if (temp == 10){ 
        c[i] = '\0';
        i++;
      }
      else if (temp == 13){
      }
      else{
        c[i] = tem;
        i++;
      }
    }
    // Als Überprüfung ob das einlesen in das Array Funktioniert hat
    for(int j = 0; j<40; j++){
      if(c[j]== '\0'){
        Serial.println("");
      }
      else{
      Serial.print(c[j]);
      }
    }
    for(int j = 0; j<10; j++){
    ul = strtoul (c, NULL, 16);
    Serial.println(ul,HEX);
    lon[j] = ul;
    }
    Serial.println("ARRAY");
    Serial.println(lon[0],HEX);
    Serial.println(lon[1],HEX);
    Serial.println(lon[2],HEX);
    Serial.println(lon[3],HEX);
    Serial.println(lon[4],HEX);
    Serial.println(lon[5],HEX);
    Serial.println(lon[6],HEX);
    Serial.println(lon[7],HEX);
    Serial.println(lon[8],HEX);
    Serial.println(lon[9],HEX);
    Serial.println("Fertig");
    myFile.close();
  } 
  else {
    Serial.println("error opening test.txt");
  }
}
void loop()
{
}

Wenn Du die '\0' gesetzt hast, wandelst Du die Zahl um, gibst sie zur Kontrolle aus, schreibst sie ins Array am index++, setzt i wieder auf 0 und liest weiter.
Nimm alles raus, was Du nicht unbedingt brauchst. Evtl. wäre es an der Zeit, das Ganze in Funktionen auszulagern, um die Übersicht zu behalten.

Gruß Tommy

Ich habe Deinen Code mal etwas aufgedröselt (ungetestet):

#include <SPI.h>
#include <SD.h>
#include <IRremote.h>
IRsend irsend;
File myFile;
char c[51];
unsigned long ul;
unsigned long lon[10];
int anzahl = sizeof(lon) / sizeof(lon[0]);

unsigned long leseZeile(File f) {
   int i = 0;
   unsigned long ul; 
    while (myFile.available()) {
      char tem = f.read();
      if (tem == 10){
        c[i] = '\0';
        ul = strtoul (c, NULL, 16);
        Serial.println(ul);
        i = 0;
        break;
      }
      else if (tem>='0' && tem <=9 || tem>='A' && tem<='F'){ // nur Hexziffern 
        c[i++] = tem;
      }
    }
  return ul;
}

void printInput() {
  int i=0;
  while (c[i]) {
    Serial.print(c[i++]);
    Serial.println();
  }
}
void setup()
{
  for(int k = 0; k<sizeof(c); k++){
    c[k]= '0';
  }
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
 
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
   
  if (!SD.begin(BUILTIN_SDCARD)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("test.txt" , FILE_READ);
  if (myFile) {
    int idx =0;
    while (myFile.available() && idx < anzahl)  {  // nicht über das Array hinaus schreiben
      lon[idx++] = leseZeile(myFile);
    }  
  }
  else {
    Serial.println("error opening test.txt");
  }
}
void loop()
{
}

Gruß Tommy

Also ich hab des jetzt so geschrieben und der ließt mir alles so ein wie ich des möchte.

#include <SPI.h>
#include <SD.h>
File myFile;
char c[51];
int zaehlen = 1;
int zaehler[5];
unsigned long ul;
unsigned long lon[5];
void setup()
{
  zaehler[0] = 0;
  Serial.begin(9600);
   while (!Serial) {
    ;
  }
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(BUILTIN_SDCARD)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  myFile = SD.open("test.txt" , FILE_READ);
  if (myFile) {
    Serial.println("test.txt:");
    int i = 0;
    int k = 0;
    while (myFile.available()) {
      char tem = myFile.read();
      byte temp = tem;
      if (temp == 10){ 
        c[i] = '\0';
        zaehler[k+1]= zaehlen+i;
        i++;
        k++;
      }
      else if (temp == 13){
      }
      else{
        c[i] = tem;
        i++;
      }
    }
    // Als Überprüfung ob das einlesen in das Array Funktioniert hat
    i = 0;
    for(int j = 0; j<40; j++){
      if(c[j]== '\0'){
        Serial.println("");
        i++;
        }
      else{
        Serial.print(c[j]);
      }
    }
    for (int j = 0; j<5; j++){      
    ul = strtoul (c+zaehler[j], NULL, 16);
    Serial.println(ul,HEX);
    lon[j] = ul;;
    }
    myFile.close();
  } 
  else {
    Serial.println("error opening test.txt");
  }
}
void loop()
{
}

Also vielen dank für eure Gedult und eure Zeit die ihr für mich investierte habt.