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};
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
#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.
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.
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.
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.
// 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.
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.
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.
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()
{
}