Bom dia pessoal, 

tenho um esp8266 01 ligado ao meu arduino mega 2560, inicialmente este esp se conecta em uma determinada rede, é atribuido um ip pra ele e depois inicio um servidor em uma determinada porta. Até ai tudo bem.

Mas estou usando um codigo retirado da web, até aqui no forum tem. Criei um app em java e através desse app eu posso enviar dados "Strings" para o esp e é exibido no monitor Serial da IDE do arduino.

Segue abaixo o trecho do codigo que faz isso.

void loop() {
// Ve se tem sinal na Serial2 e manda para a Serial
if (Serial2.available()) {
int inByte = Serial2.read();
Serial.write(inByte);
}

// Analogamente, ve se tem sinal na Serial, e manda para Serial2
if (Serial.available()) {
int inByte = Serial.read();
Serial2.write(inByte);
}
}

então, a minha duvida é a seguinte: Como eu faço pra manipular esses dados?

Tipo, fazer uma verificação [se essa string contem o valor 120 ] faça tal coisa...

Porque acho que o Serial2.read() retorna apenas binários/sequencia de bytes... então eu nao consigo manipular esses dados...

Alguem sabe como fazer?

Segue em anexo uma imagem do Monitor Serial... (os dados que eu envio fica atras dos dois pontos :    )

Exibições: 774

Anexos

Responder esta

Respostas a este tópico

pelos seus exemplos, chegaram dados como "LABDEGARAGEM8", "LABDEGARAGEM9", "LABDEGARAGEM10", "LABDEGARAGEM11"

Se seu sketch está lendo apenas caracter por caracter, basta incluir um trecho que código responsável por acumular tais caracteres lidos. Concatene os caracteres entrantes num string auxiliar.

Então basta remover da string o início que não interessa, isto é, "LABDEGARAGEM"

Outra alternativa é considerar somente os caracteres que vierem após a posição 12 

dê uma pesquisada no google pra aprender como escrever corretamente os códigos para executar as ações acima.

Isso imhugo, "LABDEGARAGEM..." é o que eu enviei do aplicativo java que criei.

Agora, filtrar esses dados na serial do arduino é o problema... 

Eu ja pensei nessa possibilidade, só que quando eu tento guardar esses dados em uma string auxiliar, nessa string fica salvo apenas numeros decimais... Visto que esses decimais correspondem aos dados da tabela ascii. 

Não existe nenhum metodo do estilo "contains" em C?

será que não foi porque vc definiu o tipo da variável inByte como inteiro?

Experimente definir como char:

// isso fica no void setup

char inByte;

String readString; // nessa string é que são acumulados os caracteres entrantes

// isso fica no void loop

inByte = Serial.read();

readString += inByte ;

Olá imhugo, 

peço desculpas pela demora para responder pois eu estava muito doente.

Realmente isso funcionou, porém não deu certo para a minha tarefa. Vou postar aqui o que está acontecendo...

Eu usei alguns metodos para verificar se há carcteres na string mas todos os metodos me retornam que não há os caractres que eu procuro... Abaixo o código...

void loop() {
// Recebe dados do esp8266 e armazena em uma String (readString)
if (Serial2.available()) {      //le os dados do esp8266
inByte = Serial2.read();
readString += inByte ;
}

// Verificação de caracteres
if (Serial.available()) {
z = Serial.read();
if (z == '1') {      //verifica se eu digitar o numero 1 no monitor serial entao faz as verificacoes
Serial.print("readString : ");
Serial.println();
Serial.print(readString);     //printa os dados no serial monitor que eu li do esp8266
Serial.println();
Serial.println();

int indexx = find_text(readString,"-");      //metodo copiado da pagina oficial do arduino (nao funcionou)
Serial.print("indexx : ");   //o metodo tambem retorna o valor -1
Serial.print(indexx);   //printa o valor -1 no monitor
Serial.println();

int indexfind = readString.lastIndexOf('*');     //retorna o valor -1
Serial.print("lastIndex : ");
Serial.print(indexfind);
Serial.println();


int first = readString.indexOf('-');    //retorna valor -1 no monitor
int second = readString.indexOf('-', first + 1 );     //retorna o valor -1
Serial.print("first : ");
Serial.print(first);
Serial.println();
Serial.print("Second : ");
Serial.print(second);
Serial.println();
if (readString.substring(first, second) == "OII") {   //este metodo eu consigo usar se eu souber a
Serial.print("Comando Recebido");                      //posicao inicial e final dos caracteres
Serial.print(readString);
readString = "";
} else {
Serial.print("Algo deu errado durante a verificacao");
readString="";
}
}
}
}

metodo  find_text  

int find_text(String needle, String haystack) {
int foundpos = -1;
for (int i = 0; i <= haystack.length() - needle.length(); i++) {
if (haystack.substring(i,needle.length()+i) == needle) {
foundpos = i;
}
}
return foundpos;
}

imagem do serial monitor 

Os dados que eu preciso verificar estao entre os caracteres (-  *)... Se eu souber a posição deles eu posso usar o substring pra verificar qual é a palavra que está ali, no caso "OII"...

Resumidamente, estou tentando verificar se essa String readString contem uma determinada sequencia "OII"... 

Essa sequencia está nela, como podem ver no monitor serial, mas os metodos utilizados por mim dizem que não está...

as vezes vem uns lixo junto, mas os dados em sí nunca vieram errados...

Alguem sabe me ajudar porque os metodos de pesquisa de caracteres não estao funcionando...?

Ou alguem tem alguma ideia melhor?

como eu não tenho como simular aqui, nem testar seu código, te sugiro fazer o seguinte: vc precisará aprender como lidar com isso. E para isso, precisará criar um sketch simples, onde vc mesmo fará os inputs (pra simular como se o ESP8266 estivesse enviando tais inputs) e programe o sketch pra fazer o que precisa, isto é, detectar início do texto de interesse e detectar final do texto de interesse.

Em outras palavras: faça um sketch para vc digitar no serial monitor qualquer lixo

A partir desse lixo, o sketch deverá detectar o caracter "-", a partir do qual irá registrar numa string os demais caracteres que vierem, e parar de guardar caracteres quando detectar o caracter "*"

Dessa forma, se por exemplo vc digitar no serial monitor algo como "asljsjxziauecjociasu asfkjasj  asjkljlj sa sdfgdf-OOI*gdfnrykdf" seu sketch deverá ser capaz de filtrar e te retornar OOI

Quando vc aprender a fazer isso, será capaz de transportar essa técnica pro seu projeto.

Está nas suas mãos

boa sorte

Reforçando as dicas do imhugo, percebi que você já está exibindo a readString na Serial, então se o caracter "-" está lá presente e nenhum comando funcionou...

Revisei o seu código e não consegui encontrar nada de errado.

O comando certo para usar é o indexOf() que você usou corretamente.

Tente apenas mudar de aspas simples para aspas duplas.
De acordo com o manual o comando deveria funcionar tanto para String quanto para char, mas não custa fazer o teste:

Mude de:

int first = readString.indexOf('-');  

Para:

int first = readString.indexOf("-");  

E nos diga o que aconteceu...

legal essa observação sobre aspas duplas vs. aspas simples. 

Já tive sketchs que não funcionavam direito quando strings ficavam contidas dentro de aspas simples, e quando mudei para aspas duplas, tudo funcionou. Porém já presenciei situações onde aspas simples funcionaram normalmente e o sketch rodou legal. Percebi então que o arduino lidava diferentemente dependendo de quando eram usadas aspas simples  ou aspas duplas, mas nunca tive curiosidade de investigar melhor sobre isso. Simplesmente ficou registrado na minha cabeça que o uso das aspas de forma errada poderia comprometer o funcionamento do sketch em determinadas situações.

Mas agora, quando vc mencionou sobre isso, retornou na minha memória esse fato que ocorreu comigo e ainda permanecia sem solução, e com isso fui tentar investigar quando usar aspas simples ou aspas duplas e veja o que encontrei:

Single quotes or double quotes?

Strings are always defined inside double quotes ("Abc") and characters are always defined inside single quotes('A').

Referência: https://www.arduino.cc/en/Reference/String

Então, fica a dica: quando for definir strings com apenas um caracter, use aspas simples. E quando a string contiver mais de um caracter, use aspas duplas

.

Isso mesmo imhugo.

Este post esclarece porque, por exemplo, "A" é diferente 'A'.

Yes, because "A" is a string with one character in it, whereas 'A' is a character constant that is equivalent to the ASCII code for capital A.  Note the use of double and single quotes!  In memory, a constant like "A" will generate two bytes, one containing the ASCII code for A, and the other holding a zero byte to indicate end-of-string.  Hope that makes sense!

http://forum.arduino.cc/index.php?topic=47538.0

Olá pessoal, resolvi o problema.

Não sei exatamente o que aconteceu...

Nao alterei nada no código exceto os comandos AT. Eu tinha lá um AT+CWMODE=3 (que coloca o esp em modo station e ap). Ai como só usava station eu alterei para AT+CWMODE=1...

Depois que fiz isso incrivelmente os metodos indexOf e lastIndexOf começaram a retornar a posição certinho, com isso consegui usar o substring e ta funcionando assim como eu esperava.

Em minha opnião acho que não deveria influenciar, então seila. Funcionou mas fiquei com uma pulga atrás da orelha...

Mas obrigado a todos.   :D

OBS.: O código permaneceu o mesmo, ou seja, utilizando os apóstrofos, não foi necessário mudar para aspas.

Por desencargo de consciência, fiz o teste abaixo e o resultado foi o mesmo.

  String s = "LabDeGaragem";
  int i = s.indexOf("G");
  int j = s.indexOf('G');
  Serial.println(i); //Imprimiu 5
  Serial.println(j); //Imprimiu 5  

Para caracteres únicos, então tanto faz usar aspas simples ou aspas duplas.

E quando a string contiver mais de um caracter, vc poderia por favor fazer um teste para sanar nossas dúvidas sobre o uso de aspas simples ou duplas?

Inhugo, veja o resultado:

  String s = "LabDeGaragem";
  int i = s.indexOf("Garagem");
  int j = s.indexOf('Garagem');
  Serial.print("Aspas");
  Serial.println(i); //Imprimiu 5
  Serial.print("simples");
  Serial.println(j); //Imprimiu 11

Ele truncou a String e considerou apenas o último caractere ("m").

Isso por que aspas simples são usadas para delimitar o tipo char e não Strings.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço