O Arduíno faz a leitura do json com o código a baixo, esta funcionando bem, sei que existe muitas bibliotecas que faz isso bem melhor, porem uso algumas outras que entra em conflito, então dessa maneira funciona bem melhor e mais leve (eu acho), gostaria de saber dos nobre amigos se alguém tem algum código parecido ou melhor, que seja simples e eficiente, ou ate mesmo indicar funções melhores para que possa chegar ao mesmo resultado! O codigo foi desenvolvido apenas para ler uma sequencia simples (nome e valor) exemplo: 

{"L6":"0","L3":"0","L4":"1","L5":"0","L2":"0","L1":"1","ON":"1","E1":"1","E2":"1"}

segue o codigo:  limpaJson.ino

String sincronizacao = "{\"TL\":70170,\"L1\":0,\"L2\":1,\"L3\":0,\"L4\":1,\"L5\":0,\"L6\":1,\"E1\":0,\"E2\":0}";

void setup() {
Serial.begin(115200);
sincroniza ();
}

void loop() {}

void sincroniza (){
Serial.println(sincronizacao);
//limpa o json, removendo:{"}
for (int i=0; i <sincronizacao.length();++i){
char c = sincronizacao.charAt(i);
if(c=='{'){sincronizacao.remove(i, 1);i--;}
if(c=='"')sincronizacao.remove(i, 1);
if(c=='}')sincronizacao.remove(i, 1);
}

Serial.println(sincronizacao);
sincronizacao = sincronizacao+",";
//Define variaveis e valores e seta os mesmo!!
int goOn = 1; int pos1=0; int pos2 = sincronizacao.length();
while( goOn == 1 ) {
pos1 = sincronizacao.lastIndexOf(",", pos2);
pos2 = sincronizacao.lastIndexOf(",", pos1 - 1);
if( pos2 <= 0 ) goOn = 0;
String tmp = sincronizacao.substring(pos2 + 1, pos1);
String nome = tmp.substring(0,tmp.indexOf(":"));
String valor = tmp.substring(tmp.indexOf(":")+1);

Serial.println("nome: " + nome + " valor: " + valor);
//comparaçoes como essa:
//if (nome == "L1")digitalWrite(L1, valor.toInt());

if( goOn != 1) break;

}
}

Exibições: 203

Anexos

Responder esta

Respostas a este tópico

Buscar a independência das bibliotecas é sempre interessante. Elas nos fazem preguiçosos e embutem riscos por trabalhar com o desconhecido, embora, em geral, deem bons resultados.

Sobre seu código, uma sugestão:

Fazer como máquina de estados.

Seria algo assim:

estados possiveis: aguardanome, nome, aguardavalor, valor;

variaveis nome,valor.

inicia o estado como aguardanome.

Um for conta do primeiro ao ultimo caracter, isolando e enviando para uma função que:

Se recebeu um "\""

   Se o estado for aguardanome passa estado para nome.

   Se o estado for nome muda estado para aguardavalor

   Se o estado for aguardavalor muda o estado para valor

   Se o estado for valor muda o estado pra aguardanome e processa (nome,valor)

Se o estado for nome:

   some em cadeianome caracter que recebeu

Se o estado for nome:

   some em cadeianome caracter que recebeu

Entendeu a ideia ? ele vai somando numa string ou outra os caracteres coforme percebe que estão entre aspas. nessa versão meio burra ele só conta aspas pares ou impares e conjuntos pares ou impares. O ideal seria fazer melhor. Algo como estados "abertochave" senão nem começa e precisar localizar um ":" para passar a procurar um valor, além de procurar um "," para passar a procurar um novo nome.

Mas se vc fizer mto complexo vai chegar no nível de complexidade da biblioteca. Que, inclusive, faz isso mto bem. Recomendo.

Gostei da sua ideia! Gostei também do seu jeito de não usar bibliotecas!! ahahah confesso que eu odeio, me parece que elas são tipo um canhão pra matar uma formiga, e não sei se é assim, mas ela toda parece ficar salva no copilado, ou seja função que nem usamos ocupando espaço e memoria. Sua ideia será muito bem aplicada em leitura serial. Mas fica registrado! vou ver se melhoro, venho do php uma linguagem bem rica de funções e de facil entendimento, as vezes fica complicado mexer com o c por causa disso é preciso criar funções que fazem esse tipo de coisa.. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço