ESP32 сохранение данных на SD-карту в формате .csv не форматируется правильно

я хочу сохранить вектор в CSV-файл на SD-карте.

Я смотрел этот учебник о том, как это сделать, и он прекрасно описывает его, хотя он немного устарел.

Моя проблема в том, что все сохраняется в первой ячейке CSV-файла, поэтому он постоянно перезаписывается . Он должен сохранить только первый вектор в первую ячейку, затем второй вектор во вторую ячейку и так далее. Я просто помещаю все три вектора с запятыми в первый вектор следующим образом:

8, 9, 10

Кроме того, заголовок, который должен появиться вверху, также исчез.

Я был бы очень признателен за помощь. Спасибо!

Вот моя настройка и цикл:

#include <iostream>
#include <string>
#include <vector>
#include "SD.h"
#include "SPI.h"
#include "EKG_data_transmision.h"

#define CS_Pin 5 // Chip Select Pin


EKG_data_transmision EKG_data_transmision;

std::vector<unsigned short> vector_1 = {1,2,3,4,5,6,7,8,9,10};
std::vector<unsigned short> vector_2 = {2,3,4,5,6,7,8,9,10,11};
std::vector<unsigned short> vector_3 = {3,4,5,6,7,8,9,10,11,12};
unsigned int for_x = 0;


void setup() {
  // open serial
  Serial.begin(9600);
  Serial.print("Init SD Card...");
  pinMode(CS_Pin, OUTPUT);

  if(!SD.begin(CS_Pin))
  {
    Serial.println("Card failed or not present");
    return;
  }
  
  EKG_data_transmision.vectorData = SD.open("/data.csv", FILE_WRITE);  //erstelle data.csv datei
  
  if(EKG_data_transmision.vectorData)
  {
    EKG_data_transmision.vectorData.println(", , , ,");
    String header = "ID, Value, Time, Whatever";
    EKG_data_transmision.vectorData.println(header);
    EKG_data_transmision.vectorData.close();
    Serial.println(header);
    Serial.println("card init sucess");
  }
  else
  {
    Serial.println("Couldnt open vector data file");
  }
  

}

void loop() {
  // put your main code here, to run repeatedly:
  
  while(for_x <= 8){
    for_x++;
    EKG_data_transmision.write_vector_to_SD(vector_1, vector_2, vector_3);
    delay(1000);
  }

  delay(10000);
}

Вот моя функция, которая должна сохранить все на SD-карту:

bool  EKG_data_transmision::write_vector_to_SD(std::vector<unsigned short> vector_ADC_1, std::vector<unsigned short> vector_ADC_2, std::vector<unsigned short> vector_ADC_3) // Übertrage
{
  dataString = String(vector_loc) + "," + String(vector_ADC_1[vector_loc]) + "," + String(vector_ADC_2[vector_loc]) + "," + String(vector_ADC_3[vector_loc]); // + "\r\n"

  vectorData = SD.open("/data.csv", FILE_WRITE);
  
  if(vectorData){
    //sd karte immer noch da und schau ob data.csv exisitiert
    vectorData.println(dataString);
    Serial.println("This is vector:");
    Serial.println(vector_loc);
    Serial.println("Im actually writing this:");
    Serial.println(dataString);
    vectorData.close(); // close the file
    }
  
  else{
    Serial.println("Error writing to file !");
}
  vector_loc++;
  
  return 0;
}

, 👍0

Обсуждение

Спасибо за быстрый ответ. Я просто изменил каждую ЗАПИСЬ на ДОБАВЛЕНИЕ. Теперь значения сохраняются в разных ячейках, но только в строке A. Я думал, что с помощью", " он переключается в разные строки. У вас есть ответ на этот вопрос?, @Xenoshell

на моем языке Excel использует ; для csv, потому что у нас есть , в качестве десятичного разделителя, @Juraj

Большое спасибо за вашу помощь!! Я только что попробовал, и с помощью `;` он работает отлично., @Xenoshell

Я перешел от первого комментария к ответу, @Juraj


1 ответ


Лучший ответ:

1

В библиотеке Arduino SD константа FILE_WRITE инструктирует функцию открыть файл для добавления, но в библиотеке esp32 SD она открывает файл для перезаписи. Используйте FILE_APPEND, чтобы открыть файл для добавления.

File file = SD.open(path, FILE_APPEND); 
,