Olá pessoal sou novo com arduino comecei a estudar faz pouco tempo, preciso enviar algumas informações para o arduino via serial com um aplicativo desenvolvido em Java, acabei escolhendo enviar a string com várias informações para o arduino receber de uma vez e tomar as decisões acender leds apagar, o problema que quando faço 2 envios rápidos as 2 string estão chegando concatenadas no arduino estou utilizando o Serial.readString() para receber as strings, vou dar um exemplo:

Código Java:

enviaDados("Olá mundo ");

enviaDados("Olá mundo ");

Arduino:

String dados = Serial.readString();

Serial.println(dados);

A saída vai ser :

Olá mundo Olá mundo

ele acabou recebendo os 2 envios em um ciclo quando deferia receber em 2 ciclos.

Alguém faz idéia do que pode estar acontecendo e para corrigir?

Exibições: 1424

Responder esta

Respostas a este tópico

Bom dia,

Se você esta começando e deseja aprender, eu recomendo que estude começando por aqui, onde encontrara muitas respostas para varias perguntas, basta colocar na caixa de pesquisa do site o que precisa (Link abaixo) caso queira apenas resolver seu problema de imediato avise.

Arduino LINK

Abs.

CK

Boa tarde 2T.

Recomendações:


1. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar

2. Clique em : " Deseja carregar arquivos? " e depois em " Escolher arquivo" e anexe o arquivo
com o seu sketch.

Assim poderemos entender melhor seu sketch e sugerir modificações.

Há um detalhe a mais:

Comente as linhas do seu sketch. Fica difícil descobrir o  que vc quer fazer com cada linha.

RV

Olá Tiago!

O método readString() é estranho mesmo.

Ele funciona por timeout. O valor do timeout você define pela Serial também.

Dessa forma, como a leitura é mais rápida que o timeout, ele acaba lendo diversos valores, como aconteceu com você.

Existe um outro método que você pode usar: readStringUntil.

Esse método lê a String até encontrar um determinado caractere.

Você pode procurar pelo fim de linha.

Exemplo:

if(Serial.available() > 0)
    {
        String dados = Serial.readStringUntil('\n');

        Serial.println(dados);
    }

Teste e depois diga se deu certo.

Obs: A sua rotina em Java deve enviar os dados com o terminador de fim de linha também.

Obrigado pela ajuda, eu tentei essa abordagem mas não deu certo vou tentar novamente.
Encontrei algumas pessoas usando modo desse link https://www.arduino.cc/en/Tutorial/SerialEvent, mas creio que não seja performatipo pois fica um while concatenando até formar a string dando o scape no caracter informado.

Sim Tiago, existem alguns exemplos que usam essa abordagem.

Mas veja que esse exemplo só vai funcionar se a rotina Java enviar o caracter "\n" do mesmo modo como comentei sobre o método readStringUntil.

Java tem enviar os dados com println ou writeln, dependendo da library utilizada.

Segue o teste que fiz na serial, estou usando 2 serial uma que recebe e outra pra imprimir e usar o monitor de serial, na parte do java estou " serialOut.write("Olá\\n".getBytes()); " usando a biblioteca https://mvnrepository.com/artifact/org.rxtx/rxtx/2.1.7 tentei \r também não funcionou


enviei 2 comandos seguidos na serial o resultado foi esse "Olá\nOlá\n"
Anexos

Boa tarde 2T,

testa este sketch, e depois de um feedback.

RV

Anexos

Mesmo resultado.

Boa noite!

Mas Tiago, no arquivo INO que vc enviou, deveria usar Serial.readStringUntil('\n');

Senão o resultado vai ser o mesmo.

Você pode também criar o seu próprio caractere de fim de linha, por exemplo o @.

Assim:

serialOut.write("Olá@".getBytes());

e depois no Arduino:

Serial.readStringUntil('@');

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço