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?
Tags:
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.
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
Boa tarde 2T,
testa este sketch, e depois de um feedback.
RV
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('@');
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por