Leer bancos de memoria SD

StringCGE:
¿Como hacen cast string a long o UL?

Con un array de char, es con atol. Con un objeto String, con la función toInt.

StringCGE:
Ya probé el boceto y sale lo logre pero leyendo la SD con e programa HxD en el sector 10000 que es el que se supone estaría escrito, no hay nada.

Oh, es que había olvidado ponerle una parte que compruebe que efectivamente se haya escrito al sector.

Si no aparecen los signos de interrogación, se me ocurre que posiblemente hayas seleccionado "Disco lógico" en vez de "Disco físico".

StringCGE:
Como escucho al SPI de arduino.
Hay alguna funcion como

Serial.available

y

Serial.read

o similar.

Si hereda de Stream debería implícitamente. Según los ejemplos, todo apunta a que en cada transfer se recibe la respuesta.
No lo sé, por eso es que nunca alcanzo a entender SPI

Veo que lo haces a tu manera, aunque... ¿recuerdas cuando te mencioné sobre desentrañar la librería SD? Pues gracias a eso, es que tengo un punto de partida para una librería que está en camino; la cuál permitirá manipular una tarjeta SD como una EEPROM/archivo gigante.

ferminolaiz:
¿Para qué serían el parse y/o find?

Los "parsers" se usan para convertir un número de texto a binario (variable), leyendo directamente desde el "stream".
El "find" se usa para recorrer el "stream" hasta encontrar un byte (o secuencia de estos) que coincida(n) con el parámetro dado.

ferminolaiz:
Con lo de una clase base me refiero a una que emule el funcionamiento de una EEPROM, para que el usuario la pueda utilizar como quiera; y otra clase que implemente, a partir del anterior, el manejo de strings.

Bueno o malo, más bien acabé juntando todo en una sola clase.

Daré un adelanto de las funciones que tendrá mi librería (hasta el momento).

// Initializers
  bool begin(unsigned char cs); // Intenta inicializar la tarjeta SD. Retorna false si falla o no logra reconocer la capacidad.
  bool begin(unsigned char cs, unsigned char mode); // Lo mismo solo que se le puede especificar la velocidad del bus SPI. Las opciones están en Sd2Card.h

  // Read/write operations
  int read(); // Lee un byte desde la poscición en la que está.
  int peek(); // Lee un byte desde la poscición en la que está, pero sin moverse.
  unsigned int readBytes(unsigned char* buff, unsigned int len); // Lee un conjunto de bytes hasta len y los guarda en buff.
  unsigned int readBytesUntil(char terminator, unsigned char* buff, unsigned int len); // Lee un conjunto de bytes hasta len o encontrar el terminador, y los guarda en buff.
  String readString(); // Crea un objeto String desde la poscición en la que está el puntero, hasta encontrarse con el caracter NULL ('\0').
  String readStringUntil(char terminator); // Crea un objeto String desde la poscición en la que está el puntero, hasta encontrarse con el caracter NULL ('\0') o el terminador.
  
  bool write(int b); // Escribe un byte en la posición en la que se encuentre.
  unsigned int write(unsigned char* buff, unsigned int len); // Escribe un conjunto de bytes provenientes de buff, hasta len.
  unsigned int writeString(String s); // Escribe el contenido del objeto String, y le agrega el teriminador; así sigue las reglas de readString().
  bool flush(); // La escritura a la tarjeta SD es asincrónica, por eso esta función garantiza que los cambios se actualicen a la tarjeta (si retorna true).

  // Addressing operations
  bool seek(unsigned long pos); // Mueve el puntero a una posición específica. Si la tarjeta es mayor a 4 GB, esta posición es relativa según el número de banco que se esté trabajando.
  bool seekSector(unsigned long sect); // Mueve el puntero a un sector específico y lo alinia al primer byte de este. Este tipo de direccionamiento siempre es absoluto.
  bool changeBank(unsigned char selection); // Selecciona el banco de memoria a trabajar. El puntero automáticamente se alinia al primer sector y byte de este. La operación falla si la tarjeta es igual o menor a 4 GB.

  unsigned long position(); // Retorna la posición actual del puntero, en bytes. De nuevo, es relativo al banco que se esté trabajando.
  unsigned long sector(); // Retorna el número de sector que actualmente está trabajando.
  unsigned long size(); // Retorna la capacidad de la tarjeta SD, en número de sectores.
  unsigned char bank(); // Retorna el número de banco que actualmente está trabajando. Siempre retornará cero si la tarjeta es igual o menor a 4 GB.

  // Public verifiers
  unsigned long available(); // Retorna la cantidad de bytes que quedan para leer/escribir sin riesgo de llegar a un desbordamiento de banco o alcanzar el final de la tarjeta.
  unsigned long availableSectors(); // Retorna la cantidad de sectores que quedan antes de alcanzar el final de la tarjeta.
  unsigned char availableBanks(); // Retorna la cantidad de bancos en la que se ha dividido la tarjeta SD, para su direccionamiento a nivel de bytes.

Faltan los put y get que vienen en EEPROM, pero más adelante las implementaré. Ahora no porque ahora estoy en proceso de implentar la función bank().

Cuando lo tenga listo, lo posteo y ahí entre los que quieran, lo analizan y lo prueban para encontrar cualquier error o característica faltante que no me haya enterado.