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.
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();
}