从mistro SD Arduino创建字符串数组



我参与了一个项目,我需要从"csv"文件中读取数据,然后我需要将这些信息存储在字符串数组中,以便在存储后搜索、写入、删除和添加信息。我从"csv"文件中处理的字段是:

ID、名称、金额:

1234马里奥$100
3245 Francisco$15.50
4356 Jorge 0.00美元
4321 Pablo 0.00美元
2346 Rene$0.00
8795索菲亚233.20美元
3569 Sandra 0.00美元
8907 Andrea 0.00美元
6890 Maru$0.00
4563 Ana 0.00美元
6789 Noemi$23.12
最终

问题是,当我创建字符串数组时,总是在索引指向的当前单元格中写入(正确的),但也覆盖以前的单元格(不正确的)。例如:

步骤0:
cell0:1234马里奥$100

步骤1:
cell0:3245 Francisco$15.50
cell1:3245弗朗西斯科$15.50

步骤3:
cell0:4356 Jorge$0.00
cell1:4356 Jorge$0.00
cell2:4356 Jorge$0.00

等等…

正如你最后可以推断的那样,我有字符串数组的所有单元格,它们都有最后的信息,6789 Noemi$23.12,但没有正确的信息。代码为:

#include <SD.h>
//Ajustes SPI
//MOSI, MISO, SCLK estan predeterminados
int CS_pin=8;
char in_char=0;
String datosSD="";
int x=0;
char myStrings[60];
char* arrayStrings[13];  
void setup()
{
Serial.begin(9600);    //Se inicializa velocidad de comunicación serial
Serial.println("Inicializando microSD");
pinMode(CS_pin,OUTPUT);  //Se configura Pin CS (8) como salida
  //Se verifica si la tarjeta esta lista
  if(!SD.begin(CS_pin))
  {
    Serial.println("Fallo microSD");
    return;
  }
   Serial.println("miscroSD lista");
  //Se abre un archivo para escribir en el
  //Solo un archivo se puede abrir a la vez
  File datoArchivo=SD.open("TEST.csv");
  in_char=datoArchivo.read();
//Se verifica si la apertura del archivo tuvo éxito para poder escribir en el archivo
if(datoArchivo)
{ 
    while(datoArchivo.available())
    {
      if(in_char!='n')
      {
        datosSD.concat(in_char);
        in_char = datoArchivo.read();
      }
      else
         {
           Serial.println(datosSD);              
           datosSD.toCharArray(myStrings, 60);  
           arrayStrings[x]=myStrings;
           x++;
             in_char = datoArchivo.read();
             datosSD="";
       }  
    } 
   datoArchivo.close(); 
}
else
  {
    Serial.println("No se pudo Accesar al Archivo");
  } 
/////////// Show the information of Array of Strings /////////////////    
 for (int i = 0; i < 13; i++)
 {
  Serial.println(arrayStrings[i]);
  delay(100);
 }
//////////////////////////////////////////////////////////////////////    
}
void loop()
{ 
}  

提前感谢

您只分配了一个字符串,而不是您认为的13。这将创建所需的字符指针数组:

char* arrayStrings[13];  

但这些只是指针,而不是字符串本身。您只有其中一个,即实际字符串:

char myStrings[60];

你一直在使用那一个字符串来读取文件。您将所有指针数组分配给同一个字符串:

arrayStrings[x]=myStrings;

因此,当你遍历指针列表并打印它们时,你会得到从文件中读取的最后一个字符串。如果您打印的是实际的指针值,这将变得清晰。试试这个,注意你看到的:

Serial.println( (int)(arrayStrings[i]) );

为了实现这一点,您需要为要保存在内存中的所有字符串分配内存。

这就成为了一个很好的学习问题。试图对内存中的数据集执行任何操作时,您将消耗几乎一半的可用RAM。再添加一点数据,或者对数据进行复杂的操作,您将无法在RAM中保存所有数据的情况下对数据执行操作。这将转变为如何将所有数据保存在磁盘(SD卡)上,并在内存中执行少量操作的问题,类似于数据库的操作方式。

试着使用String-mystrings[],它对我来说效果很好,尽管它不像jdr5ca的答案那样节省内存。然而,由于他可能是对的,而且你必须一次只读几篇文章,这应该不是问题。看看http://arduino.cc/en/Reference/StringObject有关使用String和http://arduino.cc/en/Reference/String有关更多信息,如果您需要额外的数据存储。

最新更新