| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 | #include "SdFat.h"// SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h,// 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.#define SD_FAT_TYPE 0/*  Change the value of SD_CS_PIN if you are using SPI and  your hardware does not use the default value, SS.  Common values are:  Arduino Ethernet shield: pin 4  Sparkfun SD shield: pin 8  Adafruit SD shields and modules: pin 10*/// SDCARD_SS_PIN is defined for the built-in SD on some boards.#ifndef SDCARD_SS_PINconst uint8_t SD_CS_PIN = SS;#else  // SDCARD_SS_PIN// Assume built-in SD is used.const uint8_t SD_CS_PIN = SDCARD_SS_PIN;#endif  // SDCARD_SS_PIN// Try to select the best SD card configuration.#if HAS_SDIO_CLASS#define SD_CONFIG SdioConfig(FIFO_SDIO)#elif ENABLE_DEDICATED_SPI#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI)#else  // HAS_SDIO_CLASS#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI)#endif  // HAS_SDIO_CLASS#if SD_FAT_TYPE == 0SdFat sd;File file;#elif SD_FAT_TYPE == 1SdFat32 sd;File32 file;#elif SD_FAT_TYPE == 2SdExFat sd;ExFile file;#elif SD_FAT_TYPE == 3SdFs sd;FsFile file;#else  // SD_FAT_TYPE#error Invalid SD_FAT_TYPE#endif  // SD_FAT_TYPEchar line[40];//------------------------------------------------------------------------------// Store error strings in flash to save RAM.#define error(s) sd.errorHalt(&Serial, F(s))//------------------------------------------------------------------------------// Check for extra characters in field or find minus sign.char* skipSpace(char* str) {  while (isspace(*str)) str++;  return str;}//------------------------------------------------------------------------------bool parseLine(char* str) {  char* ptr;  // Set strtok start of line.  str = strtok(str, ",");  if (!str) return false;  // Print text field.  Serial.println(str);  // Subsequent calls to strtok expects a null pointer.  str = strtok(nullptr, ",");  if (!str) return false;  // Convert string to long integer.  int32_t i32 = strtol(str, &ptr, 0);  if (str == ptr || *skipSpace(ptr)) return false;  Serial.println(i32);  str = strtok(nullptr, ",");  if (!str) return false;  // strtoul accepts a leading minus with unexpected results.  if (*skipSpace(str) == '-') return false;  // Convert string to unsigned long integer.  uint32_t u32 = strtoul(str, &ptr, 0);  if (str == ptr || *skipSpace(ptr)) return false;  Serial.println(u32);  str = strtok(nullptr, ",");  if (!str) return false;  // Convert string to double.  double d = strtod(str, &ptr);  if (str == ptr || *skipSpace(ptr)) return false;  Serial.println(d);  // Check for extra fields.  return strtok(nullptr, ",") == nullptr;}//------------------------------------------------------------------------------void setup() {  Serial.begin(9600);  // Wait for USB Serial  while (!Serial) {    yield();  }  Serial.println("Type any character to start");  while (!Serial.available()) {    yield();  }  // Initialize the SD.  if (!sd.begin(SD_CONFIG)) {    sd.initErrorHalt(&Serial);    return;  }  // Remove any existing file.  if (sd.exists("ReadCsvDemo.csv")) {    sd.remove("ReadCsvDemo.csv");  }  // Create the file.  if (!file.open("ReadCsvDemo.csv", FILE_WRITE)) {    error("open failed");  }  // Write test data.  file.print(F(    "abc,123,456,7.89\r\n"    "def,-321,654,-9.87\r\n"    "ghi,333,0xff,5.55"));  // Rewind file for read.  file.rewind();  while (file.available()) {    int n = file.fgets(line, sizeof(line));    if (n <= 0) {      error("fgets failed");    }    if (line[n-1] != '\n' && n == (sizeof(line) - 1)) {      error("line too long");    }    if (!parseLine(line)) {      error("parseLine failed");    }    Serial.println();  }  file.close();  Serial.println(F("Done"));}void loop() {}
 |