lendo dados do SD incompleto

Tento ler do cartao SD uma linha especifica de um txt só que acabo recebendo os dados incompletos

#include <SD.h>

File myFile;
String string = "";
char caracter;

void setup(){
  Serial.begin(9600);
  Serial.println("Inicializando");
  
  pinMode(10, OUTPUT);
  
  
  lerSD(0); // linha que ira ser lida do cartao SD
}

void lerSD(int linha){
  if(!SD.begin(4)){
    Serial.println("Falha na inicializacao!");
  }
  
  myFile = SD.open("AR.txt");
  
  if(myFile){
    unsigned long linhaEspec = 850 * linha; // cada linha possui 849 caracteres
    
    myFile.seek(linhaEspec); // ponto de partida para cada linha
    
    for(int i=0; i <= 849; i++){
      caracter = myFile.read();
      Serial.write(caracter);
      string.concat(caracter); // concateca o que for recebido pelo myFile.read()
    }
    Serial.print(string);
    //Serial.println();
    
    char arrayString[string.length()]; // defini o tamanho do array que ira receber a string para poder quebra-la
    string.toCharArray(arrayString, string.length()); // transfere a string para um array de char
    char *p = arrayString;
    char *str;
    char *aux[200];
    int i = 0;

       while((str = strtok_r(p, ",", &p)) != NULL){ // quebra o array a partir da ","
         aux[i] = str;
         Serial.print(aux[i]);
         i++;
       }
       i = 0;  
    myFile.close();
    
  }
  
}

void loop(){
}

O que o Serial.print(string) me mostra:

4150,4450,250,1850,300,550,550,1700,450,1700,400,600,500,550,500,1750,400,600,500,550,500,1700,450,600,500,500,550,1750,400,1750,400,550,500,1750,400,600,500,550,500,600,500,1700,450,1750,350,1750,400,1750,400,1750,400,1750,400,1750,400,1700,400,600,500,550,550,550,500,550,550,550,500,600,500,550,500,550,550,550,500,1700,450,600,450,600,500,550,550,1700,400,1750,400,1750,400,1750,400,550,500,1750,400,1750,400,1750,400,5350,4150,4500,250,1800,350,550,500,1800,350,1750,400,550,500,550,550,1750,400,600,45

O que era para ser salvo em string:
4150,4450,250,1850,300,550,550,1700,450,1700,400,600,500,550,500,1750,400,600,500,550,500,1700,450,600,500,500,550,1750,400,1750,400,550,500,1750,400,600,500,550,500,600,500,1700,450,1750,350,1750,400,1750,400,1750,400,1750,400,1750,400,1700,400,600,500,550,550,550,500,550,550,550,500,600,500,550,500,550,550,550,500,1700,450,600,450,600,500,550,550,1700,400,1750,400,1750,400,1750,400,550,500,1750,400,1750,400,1750,400,5350,4150,4500,250,1800,350,550,500,1800,350,1750,400,550,500,550,550,1750,400,600,450,600,500,1750,400,550,500,600,500,1750,350,1800,350,600,500,1650,500,550,550,500,550,550,500,1650,500,1650,500,1650,500,1600,550,1600,550,1600,550,1600,500,1650,500,550,550,500,550,550,550,500,550,550,550,500,550,550,550,500,550,550,550,1600,550,500,550,550,550,500,550,1600,550,1600,550,1600,550,1600,500,550,550,1600,550,1600,550,1600,550

Imagino que seja algo em relação a buffer ou algo do tipo. Se sim, tem alguma forma de armazenar tudo na string?
Faço isso porque depois preciso quebrar a string e armazenar em um array de 200 posicoes

Este:

      Serial.write(caracter);

funciona bem?

Eu não gosto nada do:

String string = "";

sou mais de C "puro" do que de C++, por isso não estou habituado, nem gosto de usar o "tipo" String. Se o 1º funciona, o 2 teria que funcionar também! Isto, claro em C "puro" porque aqui não compreendo muito bem como isto é feito.
Fazendo copy/paste das duas strings que postou para um editor de texto que devolva o número de colunas, consegue-se facilmente contar o número de caracteres que as duas strings contêm, sendo assim, a primeira tem 508 e a segunda 849. O número 508 "não me diz nada" o que é certo é que está bastante próximo de 512 (1/2 k, isto é se 1k=1024, e 1/2k=512). No entanto, não sei se o Arduino consegue guardar uma variável tão grande.

Se quiser tentar o método C "puro", substitua:

String string = "";

por:

char string[1024] = "";

isto:

      string.concat(caracter); // concateca o que for recebido pelo myFile.read()

por isto:

      string[i] = caracter; // constroi a string

e antes desta linha:

    Serial.print(string);

acrescente:

    string[i] = '\0';

A menos que eu tenha cometido um erro muito grosseiro, isto tem que funcionar, ou então dar erro de compilação informando que não há memória suficiente para armazenar a variável "string". Outra coisa que também pode correr mal (mas duvido) é que a função "Serial.print" não consiga "manipular" uma string tão grande.

Boa sorte! E diga qual foi a conclusão.

Concordo que devias usar tambem strings com um array de chars correctamente terminado ('\0') e não a classe String.
Ja agora se fizeres isto:
Serial.println(string.length());
Que valor recebes?
Qual a placa que estas a usar?
O atmega 328 tem 2K de ram o que a partida consegue lidar com os 849 bytes .Ja a classe String mais todos os 849 bytes não faço idea de quando deve consumir de ram, mas a class String é famosa de gerir mal a ram e com esse numero de bytes e bem provável que o problema possa estar nela.
Como o LuisSilva te sugeriu muda todo o teu código para char arrays e compara o resultado.

tentei fazer oq o luis sugeriu mas por algum motivo fica recebendo caracteres estranhos e parece que fica em loop e dando a msg "Inicializando" que eu setei bem logo a baixo do setup()

File myFile;
char string[1024] = "";
char caracter;
if(myFile){
    unsigned long linhaEspec = 850 * linha; // cada linha possui 850 caracteres
    
    myFile.seek(linhaEspec); // ponto de partida para cada linha
    int contador=0;
    for(int i=0; i <= 849; i++){
      caracter = myFile.read();
      string[contador] = caracter;
      contador++;
    }
    string[contador] = '\0';
    Serial.print(string);
....

HugoPT:
Concordo que devias usar tambem strings com um array de chars correctamente terminado ('\0') e não a classe String.
Ja agora se fizeres isto:
Serial.println(string.length());
Que valor recebes?
Qual a placa que estas a usar?
O atmega 328 tem 2K de ram o que a partida consegue lidar com os 849 bytes .Ja a classe String mais todos os 849 bytes não faço idea de quando deve consumir de ram, mas a class String é famosa de gerir mal a ram e com esse numero de bytes e bem provável que o problema possa estar nela.
Como o LuisSilva te sugeriu muda todo o teu código para char arrays e compara o resultado.

Ele me retorna 489 o valor de string.lenght(). O dobro do que eu estou desejando, teria alguma explicação?
Utilizo o arduino Uno

fica recebendo caracteres estranhos e parece que fica em loop e dando a msg "Inicializando" que eu setei bem logo a baixo do setup()

Isso quer dizer que ele está reinicializando (fazendo reset) continuamente.

Qual é exactamenet o código actual? Porque pelo que eu vi, esta parte do código:

    char arrayString[string.length()]; // defini o tamanho do array que ira receber a string para poder quebra-la
    string.toCharArray(arrayString, string.length()); // transfere a string para um array de char
    char *p = arrayString;
    char *str;
    char *aux[200];
    int i = 0;

neste momento já não faz sentido.

Nao consigo entender o porque esta reinicializando.
Em relação a esta parte que voce comentou por enquanto estou deixando comentado pois essa seria para pegar a string e quebra-la em um novo array[200] para poder manipular.

Vou repetir: "Qual é exactamente o código actual?"

desculpa a demora.. estou sem tempo mas oq fiz foi algo do tipo:

#include <SD.h>

File myFile;
char string[1024] = "";
char caracter;

void setup(){
  Serial.begin(9600);
  Serial.println("Inicializando");
  
  pinMode(10, OUTPUT);
  
  
  lerSD(0); // linha que ira ser lida do cartao SD
}

void lerSD(int linha){
  if(!SD.begin(4)){
    Serial.println("Falha na inicializacao!");
  }
  
  myFile = SD.open("AR.txt");
  
  if(myFile){
    unsigned long linhaEspec = 850 * linha; // cada linha possui 849 caracteres
    
    myFile.seek(linhaEspec); // ponto de partida para cada linha
	
    int contador = 0;
    
    for(int i=0; i <= 849; i++){
       caracter = myFile.read();
       string[contador] = caracter;
       contador++;
    }
    string[contador] = '\0';
    Serial.print(string);
    //Serial.println();
    
    char *p = string; //posso fazer isso? nao deu erro de sintaxe
    char *str;
    char *aux[200];
    int i = 0;

       while((str = strtok_r(p, ",", &p)) != NULL){ // quebra o array a partir da ","
         aux[i] = str;
         Serial.print(aux[i]);
         i++;
       }
       i = 0;  
    myFile.close();
    
  }
  
}

void loop(){
}

tentando fazer algo diferente fiz algo do tipo:

#include <SD.h>

File myFile;
char valor;
char ar[200];
int i = 0;

void setup(){
  Serial.begin(9600);
  Serial.println("Inicializando");
  
  pinMode(10, OUTPUT);
  
  
  lerSD(2); // linha que ira ser lida do cartao SD
}

void lerSD(int linha){
  if(!SD.begin(4)){
    Serial.println("Falha na inicializacao!");
  }
  
  myFile = SD.open("AR.txt");
  
  if(myFile){
    unsigned long linhaEspec = 850 * linha; // cada linha possui 850 caracteres
    
    myFile.seek(linhaEspec); // ponto de partida para cada linha
    
    char caracter;
    int laco = 0;
    //for(int i=0; i <= 849; i++){
    while(laco <= 10){  // diminui o tamanho so para testar
      caracter = myFile.read();
      if(caracter != ','){
        valor += caracter; // nao consigo concatenar os chars
        Serial.print(caracter);
      }
      else{
        ar[i] = valor;
        valor = NULL;
        i++;
      }
      laco++;
    }
    
    myFile.close();
    
  }
  
}

void loop(){
}

tem alguma forma deu poder concatenar?

Só agora é que me apercebi de uma coisa. Responda-me à seguinte questão: "Qual é o Arduino que está a usar?"

UNO

Era isso que eu estava à espera de ouvir. Então, o Arduino UNO tem 2k de memória SRAM. Isto quer dizer que todos os dados que sejam necessários guardar em memória (como as variáveis que usa no seu código, alguns dados temporários que se geram, por exemplo, quando uma função é chamada, etc.) têm que ser guardados nestes 2k de memória. Já agora, 2k são 2*1024 bytes, ou seja 2048bytes de SRAM. Se está a tentar guardar 850 bytes só numa variável, é possível que não consiga. Penso que esse é o único problema. Se o objectivo é só mostrar o conteúdo da linha, não precisa de ocupar esse espaço em memória para a "guardar". Se precisar de a armazenar, vai ter que arranjar um método alternativo.

A outra alternativa que voce diz talvez usar um Mega?
Precisaria salvar em uma variavel msm pq dpois queria manipular esse array com 200 posicoes =/
Nao consigo nem concatenar char?

Aqui:
http://playground.arduino.cc/Code/AvailableMemory

são descritos vários processos para monitorizar a ocupação de SRAM no Arduino.

O mais simples, implica a utilização desta função:

int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

e posteriormente chamar esta função durante a execução do programa.

Fui ver melhor a descrição do problema e a conclusão a que cheguei é que podia ir processando a string por partes e ir armazenando logo na array de 200 posições. Penso que é um desperdício ter um espaço de memória tão grande ocupado, só por alguns instantes, enquanto não se processa TODA a linha.
Pode por exemplo, ler todos os caracteres até encontrar a ' , ' converter esse valor para int, guarda-lo no array de 200 posições, e repetir o processo até ao fim da linha. Penso que até é mais simples que ler toda a string e depois com o strtok ir "apanhar" todos os números.