Go Down

Topic: Pasar de texto binario a texto plano para leer y escribir con una SD  (Read 130 times) previous topic - next topic

rotura

Buenas tardes. Uso un Arduino MKR ZERO con una tarjeta SD en la que creo un archivo .txt llamado myfile, escribo datos en ese archivo usando myfile.write y leo datos usando myfile.read. Hasta ahí todo perfecto. El problema es que cuando introduzco la tarjeta SD en el ordenador y abro el archivo .txt que he creado y en el que he escrito un buffer de números, no puedo visualizarlos ya que me aparecen caracteres en binario. Lo que quiero es escribir con Arduino ese buffer de números en la SD en texto plano, no en binario, para poder verlos desde el ordenador abriendo el .txt y también escribir nuevos valores o modificarlos desde ahí. Luego quiero poder leer esos valores en Arduino. He visto por ahí que para estos casos habría que usar los comandos print() y atoi pero no me ha quedado muy claro.¿Alguien me echa una mano?

hypernovat

Hola rotura, nunca he tenido problema en lograr lo que quieres al menos usando datos numéricos. Luego de abrir el archivo "datos.txt" (por ej.) uso

Code: [Select]
myfile.print() o bien myfile.println()    para grabar

y

myfyle.read()    para leer si lo quiero ver en el monitor serie o lcd, etc  


ahora para leerlo en un ordenador con un editor de texto, lo grabado con los print's se leen perfectos.


rotura

Hola hypernovat. Ante todo gracias por responder.
La estructura que usaba yo para escribir en la SD es la siguiente:
dataFile.write((const uint8_t *)&myData, sizeof(myData));
Con esta línea (asignándole el tamaño y nombre de fichero correspondientes) podía escribir sin problemas. Para poder escribir en texto plano e interpretar los valores numéricos sustituí "write" por print, quedando así:
dataFile.print((const uint8_t *)&myData, sizeof(myData));
Pero me daba error de compilación. ¿Tendría que modificar algo más para poder escribir con print()?
Para dejarlo claro entiendo que el proceso para lo que estoy buscando sería éste: escribo valores con print(), leo con read() para comprobar esos valores escritos, conecto la SD al ordenador, abro el txt y escribo o modifico algún valor, conecto la SD a Arduino, leo con read() y deberían mostrarse por el monitor serie o lcd los valores del txt (teniendo en cuenta los modificados). ¿Es correcto el proceso? Corrígeme si me equivoco.

hypernovat

Mira, aqui te paso este codigo que se que funciona a ver si es lo que necesitas.
Dejame aclararte que
el archivo "nuevo.txt" si no lo tienes en la SD se va a crear
cuando leas por monitor serie lo que vas a ver son una serie de numeros que es el ASCII de la letra o numero que se ha grabado. No se si en el lenguaje de arduino hay una funcion que te lo traduzca en forma directa, caso contrario hay que hacer una pequeña ingenieria para eso.
y por ultimo si sacas la SD del lector para leerla con un editor de texto alli te va a salir tal como lo grabo los print.
(fijate que esta trabajando en el setup, esto solo a modo de ejemplo)
Code: [Select]
#include <SD.h>


File archivo;
int cs = 4;
int d;

void setup()
{
 
  Serial.begin(9600);
 

  while (!Serial) {   
  }
  Serial.println("Initializing SD card...");
  Serial.println();
 
  pinMode(cs, OUTPUT);
  pinMode(SS, OUTPUT);
   
  // see if the card is present and can be initialized:
  if (!SD.begin(cs)) {
    Serial.println("SD did not initiliaze");   
    while (1) ;
  }
  Serial.println("SD initialized.");

   /* ESCRIBIENDO DATOS EN LA MEMORIA SD DE ARDUINO */

  //Se abre el documento sobre el que se va a leer y escribir.
 
      archivo = SD.open("nuevo.txt", FILE_WRITE);

      d=6;
      archivo.print("Z");
      archivo.print(word(d));
      archivo.print("A");
      archivo.println("AQ");
     
   
       archivo.close();
     
     
     
     delay(50);
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
    archivo = SD.open("nuevo.txt", FILE_READ);
   
   //Se muestra por el monitor que los datos se han almacenado correctamente.

    Serial.println(archivo.read());
    Serial.println(archivo.read());
    Serial.println(archivo.read());
    Serial.println(archivo.read());
    Serial.println(archivo.read());
         
     archivo.close(); 
   
   
 

 
}
void loop()
{

}

Go Up