Ola amigos

Estou tentando desenvolver um banco de dados para Arduino através de um módulo cartão sd. Até ai tudo bem. O problema é quando vou comparar a informação recebida de uma linha especifica do arquivo csv que esta no cartão, a condição nunca é verdadeira.

Para entender melhor é melhor ver o código(ta meio bagunçado mas da pra entender):

---------------------------------------------------------------------------------------------------------------------------------------------------

#include <SD.h>
File myFile;
String conteudo = "";
char caractere;
int x = 1;
int linha =1;
int cc = 1;
int c2 = 1;
int texto;
void setup(){
Serial.begin(9600);
while (!SD.begin(4)){
Serial.println("FALHA AO INICIAR SD CARD");
Serial.println("VERIFIQUE PROBLEMAS");
delay(5000);
}
Serial.println("SD INICIADO COM SUCESSO");

myFile = SD.open("banco.csv");
if (myFile){
while((myFile.available())){
for(x;myFile.read()==13;x++){
delay(10);
}
}
}
Serial.print("numero de usuarios cadastrados: ");
Serial.print(x);
Serial.println(" usuarios");
myFile.close();
myFile = SD.open("banco.csv");
if (myFile){
while(myFile.available()&&(c2==1)){
caractere=myFile.read();
while((caractere!='2')&&(cc==1)) { //aqui deve-se informar a linha que se deseja ler.
caractere=myFile.read();
delay(10);
}
cc=2;
while(myFile.available()&&(caractere!=13)){
caractere=myFile.read();
if (caractere){
conteudo.concat(caractere);
}
delay(10);
}
c2=0;
}
}
myFile.close();
Serial.println(conteudo);
String nome = "tania";
String recebido = conteudo;
if (recebido == nome){
Serial.println("Tudo Certo");
}
else{
Serial.println("ERRO");
}
}
void loop(){

}

-----------------------------------------------------------------------------------------

Arquivo csv tem os seguintes dados:

1daniel
2tania
3luis
4baltazar
5schneider
6miguel
7marcos
8ana
9pedro
10joao
11paulo
12manec

------------------------------------------------------------------------------------------

O dado recebido da linha é concatenado em uma String e não tem o numero que identifica a linha, há somente o nome da pessoa.

o problema é quando comparo essa String recebida com outra String de mesmo valor, a comparação nunca é verdadeira.

Como posso resolver este problema.

Não sei se consegui passar a minha duvida. Ficarei grato se alguém puder ajudar.

Att. Daniel Baltazar Schneider.

Exibições: 3416

Responder esta

Respostas a este tópico

será que ao final da variável "conteudo" que foi obtida do SD card não existe algum caractere não visível, tipo quebra de linha, retorno de carro, etc? 

Experimente pegar somente os 5 primeiros caracteres da variável "conteudo" e comparar com a variável "nome" que contém a palavra "tania". Diga o resultado.

não consegui encontrar nenhum caractere oculto, mas valeu pela dica.

Analisando melhor encontrei o problema, realmente era um caractere não visível.

Agora falta aprimorar para conseguir cadastrar mais usuários, por enquanto só 10 esta dando certo.

Valeu pela dica, ajudou muito.

sei la amigo, penso que esse método que vc usou pra buscar as linhas seja muito rudimentar.

Se vc perceber bem o código que postou, ele faz busca do caractere "2" para sinalizar o início da leitura e busca pelo caractere ascii 13 para sinalizar o final da leitura. Dessa forma, só vai ler 9 linhas, sendo elas 1, 2, 3, 4, 5, 6, 7, 8 e 9. A linha 10 já não será lida pois esse número é composto por 2 dígitos, o 1 e o zero, e o primeiro dígito da esquerda "1" já existe na primeira linha.

Talvez pra esse seu caso aí, seja melhor criar um algoritmo mais robusto, por exemplo lendo a quantidade de caracteres ascii 13 que sinaliza o final de cada linha. Se for fazer assim, não se deve colocar o numero no início dos nomes

sim, dessa forma fica difícil. 

To bolando uma forma de fazer uma varredura no arquivo.

Eu entro com um nome e ele verifica se este nome existe no arquivo.

Consegui melhorar o código, agora é só entrar com uma String (palavra), que é feito uma varredura no arquivo csv.

A palavra é inserida via monitor serial.

-----------------------------------------------------------------------------------------------------------------

//usuarios sao divididos por espaço
#include <SD.h>
File myFile;
String conteudo = "";
char caractere;
int x = 0;
int c2 = 1;
int texto;
String usua;
String receb = "";
char carac;
void setup(){
Serial.begin(9600);
while (!SD.begin(4)){
Serial.println("FALHA AO INICIAR SD CARD");
Serial.println("VERIFIQUE PROBLEMAS");
delay(5000);
}
Serial.println("SD INICIADO COM SUCESSO");

myFile = SD.open("banco2.csv");
if (myFile){
while(myFile.available()){
for(x;myFile.read()==32;x++){
delay(10);
}
}
}
Serial.print(x);
Serial.println(" usuarios cadastrados: ");

}
void loop(){
while (receb == ""){
while(Serial.available()>0){
carac = Serial.read();
if (carac != '\n'){
receb.concat(carac);
}
delay(10);
}
}
myFile.close();
myFile = SD.open("banco2.csv");
if (myFile){
//caractere=myFile.read();
while(myFile.available()&&(c2==1)){
caractere=0;
while(myFile.available()&&(caractere!=' ')){
caractere=myFile.read();

if (caractere!=' '){
conteudo.concat(caractere);
}
delay(10);
}
if (conteudo != receb){
conteudo="";
usua = "Usuario nao encontrado";
}
else{
usua = "Seja bem vindo(a) ";
c2=0;
}
}
}
myFile.close();
Serial.print(usua);
Serial.println(conteudo);
receb = "";
c2=1;
}

-----------------------------------------------------------------------------------------------------------------------

Aquivo csv que fica no cartão SD:

 daniel tania luis baltazar schneider ana marcos pedro ciclano fulano vinic luis_miguel

obs: os nomes devem ser separados por espaços, se for separar com ENTER deve-se modificar o código.

isso aí amigo... parabéns por compartilhar seus avanços.

Só tenho uma ressalva quanto ao trecho:

if (myFile){
while(myFile.available()){
for(x;myFile.read()==32;x++){
delay(10);
}
}
}
Serial.print(x);
Serial.println(" usuarios cadastrados: ");

desse jeito aí que vc fez, vc está contando a quantidade de caracteres ascii 32 (que são os espaços entre os nomes), correto)?

Naquela linha que contém os nomes no arquivo no cartão SD, contei 12 nomes e 11 espaços. Esse trecho do seu sketch está exibindo pra vc quantos usuários cadastrados? 10, 11 ou 12?

Cada espaço no arquivo é contado no for(), ai eu coloquei um espaço antes de cada nome(incluindo o primeiro nome) para se contado e também fazer a divisão.

No caso do arquivo ele lê 12 espaços e exibe como sendo 12 usuários.

ahhh ok, então nesse caso concordo que dá certo sim.

Mas vou deixar uma sugestão:

1) dê um TRIM para eliminar os espaços no início e final da linha

2) conte a quantidade de espaços existentes, tomando o cuidado de converter programaticamente mais de um espaço em apenas um espaço 

3) a quantidade de nomes será igual a quantidade de espaços mais um.

Penso que dessa forma fica mais robusto e a prova de falhas, pois vc corre o risco de no futuro esquecer de acrescentar um espaço em branco ao início ou pode correr o risco de acrescentar erradamente espaços no final da linha.

Nunca usei o TRIM, vou dar uma pesquisada para poder implantar.

Valeu pela dica.

Obs. Sou Técnico em Agropecuária e estudante de Agronomia (nada a ver com programação) ,

Infelizmente nunca fiz nenhum curso na área e já estou me arrependendo de ter começado Agronomia. Tudo que aprendi de programação foi sozinho. 

Amigo, todo curso superior é chato de começo. Com o tempo, vc vai tomando conhecimento das diversas sub-áreas da agronomia e quem sabe vc se identifica com alguma, e pega gosto pela coisa.

Se vc tem o dom de aprender programação sozinho, invista em aprender agronomia, porque isso sim não tem como aprender sozinho. Não tem como ser autodidata em solos, fisiologia vegetal, mecanização agrícola, irrigação, genética e melhoramento, fruticultura, olericultura, etc...

Tenho amigos agrônomos que também aprenderam sozinhos a programar e hoje mexem com agricultura de precisão. Outros trabalham com automação agrícola. Programar em C, visual basic, java, php, asp, etc vc senta a bunda na cadeira e aprende, basta ter tempo e vontade de aprender.  

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço