CSV Parsen mit gemischten Werten

Hi.

Ich stelle hier eine einfache Lösung vor, wie man mit dem Arduino Werte von einer SD-Karte parsen kann. Ich weiß nicht, ob das eine gute Möglichkeit ist, aber sie funktioniert. Im Internet fand ich nichts richtig Tolles.

Mit dieser Möglichkeit kann man verschiedene Datentypen aus dem CSV-Format lesen. Bei mir Chars und Integer.

Bei mir auf der SD-Karte sind einfache Werte geschrieben in eine test.txt.

Diese sehen so aus:

*TestName, #Testbeschreibung, 1,2,3,4,5,6,7,8,9

Ich hab * und # angeführt, damit ich die an jede beliebige Position in der CSV setzen kann. Eine neue Zeile steht für einen neuen Datensatz.

Jetzt hab ich das SD-Example-Sketch modifiziert, viel Spaß damit.

/*
SD card read/write

This example shows how to read and write data to and from an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI – pin 11
** MISO – pin 12
** CLK – pin 13
** CS – pin 4

created   Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

*/

#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
Serial.print(„Initializing SD card…“);
pinMode(10, OUTPUT);

if (!SD.begin(4)) {
Serial.println(„initialization failed!“);
return;
}
Serial.println(„initialization done.“);

// re-open the file for reading:
myFile = SD.open(„test.txt“);
if (myFile) {
Serial.println(„test.txt:“);

// read from the file until there’s nothing else in it:
while (myFile.available()) {
switch ((char)myFile.peek()) { //Liest ohne das Zeichen vom Buffer zu nehmen
case ‚#‘:
Serial.println(„Beschreibung:“);
while (myFile.available() && (char)myFile.peek() != ‚,‘ && (char)myFile.peek() != ‚\n‘)  {
Serial.print((char)myFile.read());
}
Serial.println();
break;

case ‚*‘:
Serial.println(„Name:“);
while (myFile.available() && (char)myFile.peek() != ‚,‘ && (char)myFile.peek() != ‚\n‘) {
Serial.print((char)myFile.read());
}
Serial.println();
break;
case ‚,‘: //Das überflüssige Komme aus dem Stack nehmen
myFile.read();
break;
case ‚\r‘:
Serial.println(„Neue Zeile!“);
myFile.read();myFile.read(); //Einmal \r und einmal \n aus dem Buffer nehmen.
break;
default:
Serial.println(myFile.parseInt());
break;
}
}
// close the file:
myFile.close();
} else {
// if the file didn’t open, print an error:
Serial.println(„error opening test.txt“);
}
}

void loop()
{
// nothing happens after setup
}

 

 

 

 

Kommentar verfassen