从micro SD Arduino创建一个字符串数组

时间:2013-07-29 21:30:02

标签: arrays string arduino

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

ID,姓名,金额:

1234马里奥100美元 3245 Francisco $ 15.50
4356 Jorge $ 0.00
4321 Pablo $ 0.00
2346 Rene $ 0.00
8795 Sofia $ 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 Mario $ 100

步骤1:
cell0:3245 Francisco $ 15.50
cell1:3245 Francisco $ 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()
{ 
}  

提前谢谢

2 个答案:

答案 0 :(得分:0)

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

char* arrayStrings[13];  

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

char myStrings[60];

您不断重复使用该字符串从文件中读取。您将所有指针数组分配给同一个字符串:

arrayStrings[x]=myStrings;

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

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

要使其工作,您需要为要保留在内存中的所有字符串分配内存。

这就是这成为一个优秀的学习问题。您将消耗几乎一半的可用RAM,尝试对内存中的此数据集执行任何操作。在数据上添加更多数据或操作的复杂性,您将无法使用RAM中保存的所有内容对数据执行操作。这将变成一个问题,即如何将所有数据保存在磁盘(SD卡)上,并在内存中执行少量操作,类似于数据库的操作方式。

答案 1 :(得分:0)

尝试使用String mystrings []代替它,它对我来说效果很好,虽然它不像jdr5ca的答案那样具有内存效率。但是,由于他可能是正确的,而且你一次只能阅读作品,这应该不是问题。看看http://arduino.cc/en/Reference/StringObject 有关使用String和的帮助 http://arduino.cc/en/Reference/String 如果您需要额外的数据存储,请获取更多信息。