Modificar tarjeta SD desde PC

Hola buenas a todos, me gustaría saber si alguien sabe o se le ocurre alguna forma de modificar el contenido de una tarjeta SD montada en un Arduino usando una ethernet shield, el caso es es que tengo dos archivos .txt uno es un registro de datos donde Arduino va registrando una seri de datos y otro es una lista de claves donde Arduino consultara si se encuentra una clave o no, hasta ahora tanto para leer el registro de datos como borrar o añadir claves nuevas tengo que sacar la tarjeta SD y introducirla en un ordenador y lo que quiero conseguir es poder hacerlo sin necesidad de sacarla.

He buscado información para hacerlo atreves de ethernet pero no encuentro nada de lo que busco, habría alguna forma de poder abrir el archivo .txt desde el ordenador? o de que forma se podría lograr?

Un saludo y muchas gracias por su tiempo.

Desde ethernet (red) al menos yo no tengo idea alguna, pero por serial (USB) creo que sí.

Aunque hasta donde permite la clase File, lo que se puede hacer es: lectura, adjuntado (escribir al final del archivo, insertando más bytes/caracteres), y sobrescritura.

Si es para insertar texto o eliminarlo, habría que primero tener una copia en memoria del contenido del archivo, realizar los cambios; y así aplicarlos al archivo, reconstruyéndolo desde cero. No sé si es así como funcionan los editores de texto plano o me equivoco.

Si no es posible trabajar con una copia en memoria (o en el monitor serie), se podría en un archivo temporal, lo malo es que cada cambio implicaría crear un archivo temporal nuevo; lo cuál en textos grandes podría tornarse lento y desgastante para la tarjeta.

Ambas cosas pueden hacerse via serial o via Ethernet o WIFI o BT o como gustes pero requiere usar al Arduino para la tarea.
Tu deberás enviar algun comando que edite/reemplace lo que deseas cambiar.
El medio de comunicación es lo de menos. La tarea con la SD será la misma siempre.
Supongamos que creas un simple menú que dice, agregar, editar o actualizar y borrar, tal como una base de datos.
Bueno crea los comandos para hacerlo y luego podras cambiar lo que gustes.

Gracias por sus contestaciones, yo se que se puede hacer y el tema de leer el archivo o añadir alguna linea en un archivo .txt lo veo bastante sencillo pero lo de poder ver el archivo entero y borrar alguna linea no lo veo tan claro, la cuestión es tendría que descargar todo el archivo luego modificarlo, borrar el original y volver a crearlo de cero? o existe alguna forma mas sencilla menos tediosa? sabéis de alguien que lo haya intentado?

gracias por su tiempo.

Para responder eso debes ser mas específico y comenzar a dar detalles de tu archivo.
Dino como esta conformado tu archivo .txt para luego poder responderte.
Basicamente lees el archivo de tu sd y suponiendo que puedes mantenerlo en el buffer, podrias modificarlo mientras identificas que cambiar y luego volver a guardarlo con los pasos previos (borrar) que sean necesarios.

Ricardo9169:
existe alguna forma mas sencilla menos tediosa?

Si te refieres a que el Arduino se encargue de la edición del texto, y que el medio de comunicación sea la interfaz... sí.
Lo que quise decir antes, es que la implementación va estar difícil, pero no imposible (en especial con 2 KB de RAM).

Lo primero que se me viene a la mente es: editar línea por línea; al menos así me lo imagino con la comunicación serial como interfaz:

  • Leer una línea, mostrarla; luego rescribir esa línea con los cambios para así aplicarlos al archivo.
  • Enviar un salto de línea sin texto, significa dejar la actual sin modificaciones (saltársela); y enviar "etiquetas" especiales para comandos como "Ver progreso actual", "Salir sin guardar" y "Salir y guardar".
  • Los cambios no se verán reflejados en el archivo original hasta que se envíe el comando de "Salir y guardar".

No sé si me captas la idea...

Hola.
Intentaré una breve explicación a ver si arrojo un poco de luz. Podemos imaginarnos un objeto file como un editor de texto sin la opción de insertar ni suprimir. Sólo podemos sobreescribir en cualquier posición, agregar texto al final, o borrar del final del archivo (básicamente es indicarle que el tamaño es menor, con lo que se descartan los caracteres que queden fuera de dicho tamaño). Podemos ubicar un "cursor" de lectura o escritura en cualquier parte del archivo.
Ahora ¿Cómo podemos realizar la supresión de una línea o un trozo de archivo?
Si un archivo tiene una longitud de 100 caracteres y queremos eliminar los cinco últimos, basta con truncar dicho archivo, que es lo mismo que decir que cambie la longitud indicada en su cabecera a 95 caracteres; pero, ¿si esos cinco caracteres están en la posición 50? Pues necesitaremos dos cursores: uno que lea desde la posición 55 a la 100, y otro que vaya escribiendo lo que lee el primero, pero desde la posición 50 a la 95, y finalmente reducir la longitud como en el caso anterior.
Otro método sería utilizar dos objetos File, el primero para leer el archivo completo y el segundo para ir escribiendo en un nuevo archivo lo que lee el primero, saltando la escritura desde el carácter 50 al 55. Finalmente podemos eliminar el fichero A y renombrar el B.

¿Se entiende más o menos?

surbyte:
Para responder eso debes ser mas específico y comenzar a dar detalles de tu archivo.
Dino como esta conformado tu archivo .txt para luego poder responderte.
Basicamente lees el archivo de tu sd y suponiendo que puedes mantenerlo en el buffer, podrias modificarlo mientras identificas que cambiar y luego volver a guardarlo con los pasos previos (borrar) que sean necesarios.

El archivo que quiero modificar son claves de 7 caracteres en este caso números decimales separadas entre si mediante un final de linea.

Ejemplo:

9879865
5672348
4597365
9863973

y me gustaría poder ver la lista entera y poder por borrar la linea 3 por ejemplo, todo esto desde un pc sin tener que extraer mi tarjeta SD

Lucario448:
Si te refieres a que el Arduino se encargue de la edición del texto, y que el medio de comunicación sea la interfaz... sí.
Lo que quise decir antes, es que la implementación va estar difícil, pero no imposible (en especial con 2 KB de RAM).

Lo primero que se me viene a la mente es: editar línea por línea; al menos así me lo imagino con la comunicación serial como interfaz:

  • Leer una línea, mostrarla; luego rescribir esa línea con los cambios para así aplicarlos al archivo.
  • Enviar un salto de línea sin texto, significa dejar la actual sin modificaciones (saltársela); y enviar "etiquetas" especiales para comandos como "Ver progreso actual", "Salir sin guardar" y "Salir y guardar".
  • Los cambios no se verán reflejados en el archivo original hasta que se envíe el comando de "Salir y guardar".

No sé si me captas la idea...

Con tedioso queria referirme a que el arduino no necesite mucho tiempo para lograrlo, es decir que no este mucho tiempo ocupado, y a mi se me ocurre la idea de leer el archivo entero en el pc y poder verlo, modificarlo y volver a enviarlo entero y así crear un nuevo txt. modificado, pero tampoco tengo muy claro como hacerlo.

noter:
Hola.
Intentaré una breve explicación a ver si arrojo un poco de luz. Podemos imaginarnos un objeto file como un editor de texto sin la opción de insertar ni suprimir. Sólo podemos sobreescribir en cualquier posición, agregar texto al final, o borrar del final del archivo (básicamente es indicarle que el tamaño es menor, con lo que se descartan los caracteres que queden fuera de dicho tamaño). Podemos ubicar un "cursor" de lectura o escritura en cualquier parte del archivo.
Ahora ¿Cómo podemos realizar la supresión de una línea o un trozo de archivo?
Si un archivo tiene una longitud de 100 caracteres y queremos eliminar los cinco últimos, basta con truncar dicho archivo, que es lo mismo que decir que cambie la longitud indicada en su cabecera a 95 caracteres; pero, ¿si esos cinco caracteres están en la posición 50? Pues necesitaremos dos cursores: uno que lea desde la posición 55 a la 100, y otro que vaya escribiendo lo que lee el primero, pero desde la posición 50 a la 95, y finalmente reducir la longitud como en el caso anterior.
Otro método sería utilizar dos objetos File, el primero para leer el archivo completo y el segundo para ir escribiendo en un nuevo archivo lo que lee el primero, saltando la escritura desde el carácter 50 al 55. Finalmente podemos eliminar el fichero A y renombrar el B.

¿Se entiende más o menos?

Lo de los punteros no lo veo claro ya que no seria una forma fácil de modificar ya que tendrías que saber que posición exacta del archivo .txt quieres sustituir, pero muchas gracias por la explicación siempre es bueno escuchar varias opciones pero no la termino de ver clara

Eso es muy facil de hacer.
Todo esto pasa cuando no explicas bien tu problema en el primer post.
Nosotros que hemos respondido muchas consultas comenzamos a divagar y resulta que luego todo se aclara de manera simple.
Cada vez que leas una línea sabrás si quieres o no modificarlo.
Su resolución es fácil.

Ricardo9169:
y a mi se me ocurre la idea de leer el archivo entero en el pc y poder verlo, modificarlo y volver a enviarlo entero y así crear un nuevo txt. modificado, pero tampoco tengo muy claro como hacerlo.

Oh entonces la implementación sería mucho más sencilla:

  • Sería abrir el archivo para lectura, enviar su contenido por el medio que sea (al serial por ejemplo, así lo ves en el monitor serie).
  • Luego vas y copias eso a algún editor de texto ("Bloc de notas" para los usuarios de Windows que busquen algo que sea rápido y sin instalar nada), y lo editas según tus necesidades.
  • Para la parte de enviar los cambios... tienes dos opciones: enviar línea por línea o usar RealTerm (u otro programa que envíe el contenido de un archivo vía serial o lo que sea).
  • Un pin digital cómo entrada; funcionará para poner en Arduino en "modo lectura" o "modo receptor".

Permíteme explicar eso último:

Modo lectura: el pin debe quedar desconectado de todo, al arranque del programa. En este modo, el programa se limitará solo a leer archivos y enviar su contenido.

Modo receptor: el pin debe quedar conectado a tierra antes del arranque/reinicio. En este modo, crea un archivo nuevo (evita abrir uno existente); así cualquier byte/caracter que reciba, será inmediatamente escrito (volcado) a ese archivo.
Este en algún momento debe cerrarse; así que para esto, el pin se desconecta de tierra; finalizando la recepción y volviendo al modo lectura.

Te suena ahora?

No estoy hablando de punteros, aunque tiene ciertas similitudes. Sencillamente te estoy explicando las características de los archivos de acceso aleatorio. Echa un vistazo a los distintos métodos de la clase File, en especial seek que es en lo que se basa el acceso aleatorio y la sobrescritura que te citaba.
El utilizar registros de tamaño fijo, como propones, ayuda mucho a un tratamiento ágil de la información, ya que un registro puede sobrescribir a otro sin dejar "basura". Por ejemplo, si en tu caso necesitas eliminar un registro determinado, como son todos de siete caracteres de longitud, si no importa el orden, puedes sobrescribir el registro a eliminar con el dato del último registro, y a continuación truncar el tamaño del archivo. Otra opción es sencillamente añadir a cada registro un campo más para señalizarlo como borrado. En realidad no lo borras, pero al leerlo sabes que está "borrado" y puedes no devolverlo, y también lo puedes recuperar sencillamente quitando la marca de borrado o reutilizar para un nuevo registro.

Primero perdón por las tardanzas,

y segundo muchas gracias por sus contestaciones me habéis ayudado mucho y ya tengo una idea bastante clara de como hacerlo, ya estoy manos a la obra aun que no se que tardare por falta de tiempo pero en tener algo acabado lo compartiré con vosotros.

Un saludo.

PD: Podeis cerrar tema.