2013-07-29 5 views
0

Я участвую в проекте, где мне нужно ЧИТАТЬ данные из файла «csv», а затем мне нужно хранить эту информацию в массиве строк для поиска, записи , удалять и добавлять информацию после хранения. Поля, которые я обрабатывать из файла "CSV" являются:Создание массива строк из miscro SD Arduino

ID, имя, количество:

1234 Марио $ 100
3245 Франциско $ 15,50
4356 Jorge $ 0,00
4321 Пабло $ 0,00
2346 Rene $ 0,00
8795 София $ 233,20
3569 Sandra $ 0,00
8907 Andrea $ 0,00
6890 Мару $ 0,00
4563 Ana $ 0,00
6789 Noemi $ 23,12
FINAL

проблем заключается в том, когда я создать массив строк, всегда пишут в современных клетках, что точки индекса (что правильно), но перезаписать тоже предыдущие клетки (что не является правильным), например:

шаг 0:
cell0: 1234 Марио $ 100

step1:
cell0: 3245 Francisco $ 15,50
cell1: 3245 F rancisco $ 15,50

step3:
cell0: 4356 Jorge $ 0,00
cell1: 4356 Jorge $ 0,00
CELL2: 4356 Jorge $ 0,00

и так далее ...

Как вы можете сделать вывод, в конце концов, У меня есть все ячейки Array of Strings с последней информацией, 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() 
{ 
} 

Спасибо заранее

ответ

0

Вы только выделили одну строку, а не 13 вы думаете. Это создает необходимый массив указателей символов:

char* arrayStrings[13]; 

Но это только указатели, а не сами строки. У вас есть только один из них, который является фактической строкой:

char myStrings[60]; 

Вы продолжаете повторно использовать эту одну строку для чтения из файла. Вы назначаете все массивы указателей на эту же одну строку:

arrayStrings[x]=myStrings; 

Итак, когда вы идете список указателей и распечатать их, вы получите ту же последнюю строку чтения из файла. Если вы напечатали, фактическое значение указателя, это станет ясным.Попробуйте это, и обратите внимание на то, что вы видите:

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

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

И здесь это становится отличной проблемой обучения. Вы будете потреблять почти половину доступной ОЗУ, пытаясь выполнить любые операции над этим набором данных в памяти. Добавьте немного больше данных или сложность операций над данными, и вы не сможете выполнять операции с данными со всем, что находится в ОЗУ. Это изменит проблему сохранения всех данных на диске (SD-карту) и будет выполнять операции в памяти только на небольших количествах, подобно тому, как работает база данных.

+0

Теперь я понимаю, что происходит с кодом, индекс «x» изменяется, но строка всегда одна и та же, поэтому каждый указатель указывает на тот же адрес в конце. Вы правы, что я пытаюсь сделать, это какая-то база данных, но мне нужно изменить свою стратегию. Я планирую знать положение каждой информации в файле «csv», чтобы записывать/перезаписывать/удалять информацию, когда я нахожу данные и не храню всю информацию в ОЗУ, можете ли вы дать мне несколько подсказок для выполнения этой операции? , проблема заключается в том, как узнать положение точных данных в файле «csv». Заранее благодарю @ jdr5ca. – Mario

0

Попробуйте использовать String mystrings [] вместо этого, он отлично работал для меня, хотя это не так эффективно, как память jdr5ca. Однако, поскольку он, вероятно, прав, и вам придется читать только отдельные фрагменты за раз, это не должно быть проблемой. Посмотрите на http://arduino.cc/en/Reference/StringObject на помощь с помощью String и http://arduino.cc/en/Reference/String для получения дополнительной информации, если вам нужно дополнительное хранилище данных.

+0

Если я использую «String mySatring», в программе будет ошибка, из-за «arrayStrings [x] = myStrings», arrayStrings - это тип «char *», это несоответствие, спасибо за ссылки. – Mario

Смежные вопросы