【问题标题】:Creating an Array of Strings from miscro SD Arduino从 micro SD Arduino 创建字符串数组
【发布时间】:2013-07-29 21:30:02
【问题描述】:

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

身份证、姓名、金额:

1234 马里奥 $100
3245 弗朗西斯科 $15.50
4356 豪尔赫 $0.00
4321 巴勃罗 $0.00
2346 雷内 $0.00
8795 索非亚 $233.20
3569 桑德拉 $0.00
8907 安德里亚 $0.00
6890 丸 $0.00
4563 安娜 $0.00
6789 诺埃米 $23.12
最终

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

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

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

第三步:
cell0:4356 豪尔赫 $0.00
cell1:4356 豪尔赫 $0.00
cell2:4356 豪尔赫 $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()
{ 
}  

提前谢谢你

【问题讨论】:

    标签: arrays string arduino


    【解决方案1】:

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

    char* arrayStrings[13];  
    

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

    char myStrings[60];
    

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

    arrayStrings[x]=myStrings;
    

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

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

    要完成这项工作,您需要为要保留在内存中的所有字符串分配内存。

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

    【讨论】:

    • 我现在明白代码发生了什么,索引“x”发生了变化,但字符串始终相同,因此每个指针最后都指向相同的地址。你是对的,我试图做的是某种数据库,但我需要改变我的策略。我打算知道“csv”文件中每个数据的位置,以便在我找到数据而不是将所有信息存储在 RAM 中时写入/覆盖/删除信息,你能给我一些提示来执行这个操作吗? ,问题是如何知道“csv”文件中的确切数据位置。提前感谢您@jdr5ca。
    【解决方案2】:

    尝试使用 String mystrings[] 代替,它对我来说效果很好,尽管它不像 jdr5ca 的答案那样有效。但是,由于他可能是对的,并且您一次只能阅读几篇文章,所以这应该不是问题。看看http://arduino.cc/en/Reference/StringObject 寻求帮助使用字符串和 http://arduino.cc/en/Reference/String 如果您需要额外的数据存储,请了解更多信息。

    【讨论】:

    • 如果我使用“String mySatrin”,程序会出错,因为“arrayStrings[x]=myStrings”,arrayStrings是一个类型“char*”,是不匹配的,谢谢你的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    相关资源
    最近更新 更多