limite en string ?

hola como les va? tengo una duda, los string tienen un limite de caracteres que pueden recibir ya que en un proyecto que estoy realizando donde tengo que leer un .txt de la sd, lee bien pero al llegar a los 450 caracteres mas o menos es string se corta. probe con varios. txt y son parecidos los limites de caracteres 450 449 etc.

pongo parte del codigo que tengo para que me digan si hay algo mal.

void sd() {
  char caracter;
  String puerto;
String ipnativo= "";

   myFile = SD.open("startup2.txt");
unsigned int totalBytes=myFile.size();

 if (myFile) {   
     if(UltimaPocicion>=totalBytes)   UltimaPocicion=0; 
     myFile.seek(0); 
     
     while (myFile.available()) {    
     caracter=myFile.read();
        cadena+=caracter;      
  }}
  delay (1000);
myFile.close();


Serial.println(cadena);

estoy usando el 60 porciento de la memoria de almacenamiento y dinámica según el compilador.

bueno saludos gracias

Asumiendo Atmega328P: tiene 2048 bytes de RAM; y si el 60% está siendo usado, entonces hay 820 bytes libres.
Por lo que puedan consumir las variables locales, quizá haya apenas 600 bytes realmente libres.
Si almacenamos caracteres con un objeto String, por mucho le doy un límite de 250 caracteres si el búfer interno pasa creciendo constantemente; 500 si el espacio se preasignó a la hora de instanciar.

Dejando de lado la memoria RAM, aún existen límites pero más difíciles de alcanzar:

unsigned int totalBytes=myFile.size();

Es un límite que estás imponiendo. De ese modo, el archivo no debe tener más de 65535 bytes/caracteres (64 KB). available es peor: el límite viene siendo la mitad de esa última cifra.

size retorna unsigned long; por lo tanto, el límite definitivo se extiende a una cantidad descomunal de 4294967295 bytes/caracteres (4 GB). No solo es el límite definitivo por implementación o tipo de dato, también lo es por el mismo sistema de archivos FAT32.

Si la memoria RAM fuera infinita, aún tenemos una restricción que impone el compilador: un vector (array) no puede ser de más de 32767 bytes/caracteres (32 KB).

Si lo único que buscas es volcar un archivo al puerto serial, no hay razón para retener datos en RAM; ¡"suéltalo" de una vez!
available no es la mejor opción para determinar el fin de un archivo mayor a 32 KB, para eso utiliza una variable unsigned long y size.

Mi recomendación:

// UltimaPosicion debe ser global y de tipo unsigned long

void sd() {
 File myFile = SD.open("startup2.txt");
 if (myFile) {   
  if (UltimaPosicion >= myFile.size()) UltimaPosicion = 0;
  myFile.seek(UltimaPosicion);

  for (unsigned long faltantes = myFile.size() - UltimaPosicion; faltantes; faltantes--)
   Serial.write(myFile.read());

  UltimaPosicion = myFile.size();
  myFile.close();
  delay(1000);
  Serial.println();
 } else Serial.println(F("*** Error al abrir el archivo ***"));
}

hola lucario, nuevamente gracias por responder, cada vez que hago una pregunta sos el primero en responder y muy informativo, te cuento, guardo el string llamado cadena, porque luego lo descompongo y con ello mando mensajes udp. dentro del string tengo la informacion de cada uno de los mensajes puertos y ip de los mensajes udp que mando al presionar un boton. por ello cada vez que recibe una orden llama el string lee la linea que necesita y manda el mensaje, lo realiza muy bien este trabajo pero me di cuenta que la cantidad de botones que puedo poner esta limitada por el limite del string que no me deja leer mas datos del .txt. voy a probar con tu codigo y te cuento si mejoro o no el tamaño de la cadena.

muchas gracias saludos

elfresno:
nuevamente gracias por responder, cada vez que hago una pregunta sos el primero en responder y muy informativo

Gracias, aunque dependiendo del tema no sería el primero; de hecho, posiblemente nunca hubiera respondido.
Mi único requisito para contestar una pregunta, es tener experiencia y conocimiento sobre el tema. No quiero al final "meter la pata" generando desinformación; además de evitar frecuentar el "creo" porque resta credibilidad y confianza a la respuesta.

Decir "creo" ocasionalmente puede ser seña de honestidad al hablar; pero abusar de la palabra (y sus sinónimos) ya es seña de desconfianza. Al menos así lo pienso yo...

Ejem, volviendo a la pregunta...

elfresno:
te cuento, guardo el string llamado cadena, porque luego lo descompongo y con ello mando mensajes udp.

Entonces no es volcar el archivo entero, sino recuperar una línea de texto. Con la RAM libre creo que tienes bastante; si aún no te sientes seguro, entonces muéstrame el código completo que podría jurar que tiene detalles que se pueden mejorar.

Como siempre digo, no recomiendo String cuando la memoria está comprometida; en su lugar, con un vector de char se puede hacer lo mismo. La memoria consumida estaría establecida; lo que quiere decir que la razón de un posible cuelgue se vuelve más obvia.

PD: creo que con el código completo entendería mejor tu punto. No tengo claro eso de los botones, los mensajes UDP y sobre todo cuál es el objetivo del archivo de texto.