Ler linhas de um arquivo .txt e separar em variáveis

Bom dia amigos,
Criei uma função que lê linhas de um arquivo .txt e exibe na tela duas variáveis. O formato do meu arquivo txt e uma string por linha e as variáveis separadas pelo caractere pipe |
Meu problema é que onde deveria estar sendo exibido o resultado, nada aparece. Já revisei minha lógica a noite toda e não encontrei algo errado. Talvez um novo par de olhos me ajude.
Meu arquivo TXT salvo no cartão SD está no seguinte formato:

|Teste de texto com mais texto|+556239213377
|Teste de texto com mais texto|+556239213377
|Teste de texto com mais texto|+556239213377
|Teste de texto com mais texto|+556239213377
|Teste de texto com mais texto|+556239213377

Meu código que lê e exibe as duas variáveis é:

#include <SD.h>

File myFile;

void setup(){

  Serial.begin(19200);
  pinMode(10, OUTPUT);

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("SD iniciado");
}

void loop(){
  getData();
  delay(3000);
}


void getData()
{
  if(SD.exists("sms.txt")){
    myFile = SD.open("sms.txt");

    char mensagem[161];
    char numero[15];
    byte pointer = 0; 

    byte firstChar = 1;
    byte secondPipe = 0;

    if (myFile) {

      while (myFile.available()) {

        char c = myFile.read();

        if(c == '|' && firstChar == 1)
        {
          firstChar = 0;
        }

        if(c != '|' && firstChar == 0 && secondPipe == 0)
        {
          mensagem[pointer] = c;
          pointer++;
          mensagem[pointer] = '\0';
        }

        if(c == '|' && firstChar == 0 && secondPipe == 0)
        {
          secondPipe = 1;
          pointer = 0;
        }

        if(c != '|' && firstChar == 0 && secondPipe == 1 && c != '\n')
        {
          numero[pointer] = c;
          pointer++;
          numero[pointer] = '\0';
        }
        if(c == '\n' && firstChar == 0 && secondPipe == 1)
        {
          pointer = 0;
          firstChar = 1;
          secondPipe = 0;
          Serial.println(mensagem);
          Serial.println(numero);
        }
      }
      myFile.close();
    }
    else{
      Serial.println("Erro ao abrir o arquivo");
      return;
    } 
  }
  else{
    Serial.println("Arquino nao existe");
    return;
  }
}

Se alguém puder testar ou me dizer onde errei nesse código, ficaria grato.

Mais um post... dizes o que queres fazer, metes um código e não dizes o que é que este código não está a fazer ou fazer mal... Que esperas que a gente faça?

renatotavares:
Meu problema é que onde deveria estar sendo exibido o resultado, nada aparece. Já revisei minha lógica a noite toda e não encontrei algo errado. Talvez um novo par de olhos me ajude.

Terceira linha, eu digo o que está errado.

Lembrando que o:

Serial.println(mensagem);
Serial.println(numero);

Da função getData deveria exibir os dados separados e não o faz.

:wink:

Porque é que terminas a string mensagem com '\0' sempre que lês um caracter?

E isto? Não seria mais simples?

char c;
int i = 0;
while((c = myFile.read()) != '|'); //encontra uma pipe... adicionar um timeout... 
//chegamos aqui, lemos a primeira pipe. 

while ((c = myFile.read()) != '|') { vamos copiar uma mensagem... 
   mensagem[i++] = c; 
}
mensagem[i] = '\0'; 
i = 0; 

while ((c = myFile.read()) != '|') { vamos copiar uma mensagem... 
   numero[i++] = c; 
}
numero[i] = '\0'; 
i = 0;

Realmente assim é mais simples. Não tenho tanta experiência para notar essas nuances. Valeu a ajuda, seu código funciona perfeitamente.

Não são nuances... é copiar dum buffer. Nota que tens de implementar um timeout no ciclo while para evitar prender o código. Como está, o programa pode prender aí até encontrar uma pipe vinda do ficheiro.

Outra coisa a teres em conta é o tamanho de memória. O microcontrolador tem um tamanho de memória finito... e convém poupar ao máximo essa memória. Criares mega arrays de 160 posições não é uma maneira de fazer isso.

Nota também que o programa da forma que fizeste não bloqueia. Enquanto que o programa da forma que fiz fica bloqueado até ao final do ficheiro. Isso pode intereferir com mais coisas que o Arduino esteja a fazer.

bubulindo:
Porque é que terminas a string mensagem com '\0' sempre que lês um caracter?

E isto? Não seria mais simples?

char c;

int i = 0;
while((c = myFile.read()) != '|'); //encontra uma pipe... adicionar um timeout...
//chegamos aqui, lemos a primeira pipe.

while ((c = myFile.read()) != '|') { vamos copiar uma mensagem...
  mensagem[i++] = c;
}
mensagem[i] = '\0';
i = 0;

while ((c = myFile.read()) != '|') { vamos copiar uma mensagem...
  numero[i++] = c;
}
numero[i] = '\0';
i = 0;

Eu estou com um projeto parecido, tenho uma trava de porta com sensor RFID e as tags estão gravadas no cartão SD (cada tag em uma linha). Preciso de um código que compare cada linha com a tag usada no sensor RFID, alguém pode me dar uma luz se é dessa forma??

Estás a usar o caracter '|' para fazer a separação entre chaves?

Zugurok:
Eu estou com um projeto parecido, tenho uma trava de porta com sensor RFID e as tags estão gravadas no cartão SD (cada tag em uma linha). Preciso de um código que compare cada linha com a tag usada no sensor RFID, alguém pode me dar uma luz se é dessa forma??

Caso Ainda Necessite eu fiz Assim:

myFile = SD.open("Setup.txt");

if (myFile){
while (myFile.available()){
char c;
if(c = myFile.read() == '('){
while ((c = myFile.read()) != ')')Serial.write(c);
Serial.println();
}