Oi pessoal,
estou com uma dificuldade com a biblioteca Serial.
Ao tentar entender e ajudar o nosso amigo Felipe nos Post
encontrei esta dificuldade.
Vou postar um sketch reduzido para facilitar a explicação:
long valor;
void setup()
{
Serial.begin(9600);
Serial.println(" Digite um valor : "); // Debug
}
void loop()
{
if (Serial.available() > 0)
{
Serial.print(" Serial : "); // Debug
Serial.println(Serial.available()); // Debug
valor = Serial.parseInt();
Serial.print(" valor : ");
Serial.println(valor); // Debug
Serial.println(); // Debug
}
}
na tela da serial após digitar um valor aparece:
Digite um valor : (digitei o valor 7)
Serial : 1 <--------
valor : 7
Serial : 1 <--------
valor : 0
Porque encontrou o valor "1" duas vezes ao verificar serial.available() ?
A função Serial.parseInt(); não zera o available
Rui
Tags:
veja em: http://arduino.cc/en/Serial/available
Get the number of bytes (characters) available for reading from the serial port.
Portanto, esse "1" que apareceu não indica o valor que vc digitou, mas sim a quantidade de bytes disponíveis para leitura
Oi Imhugo, boa noite,
a minha dúvida é porque este valor não zerou na primeira vez que eu dei o comando "Serial.parseInt();"
e zerou na segunda vez.
Rui
Boa noite,
Você pode estar enviando um carácter com nova linha e o software entende como ainda tem carácter no bufer da serial.
a função Serial.parseInt(); não zera o bufer e sim retorna o primeiro longa inteiro.
Acredito que seja isto.
Obs. (Serial.println(Serial.available()); // Debug) está linha somente indica que tem alguma coisa na serial, 1 para True e 0 para false.
Abs
Mauricio Ortega
ahhh agora entendi sua dúvida...
o problema é a forma como vc configurou o serial monitor.
Experimente deixar o serial monitor em NO LINE ENDING. Pressione 7 e digite enter
vc terá como resultado:
Serial : 1
valor : 7
Agora se vc deixar configurado com uma das outras 3 opções, se vc digitar 7 e der enter, terá um resultado diferente:
Serial : 1
valor : 7
Serial : 1
valor : 0
Por que? A própria opção já te dá a dica: é como se vc tivesse dado um ENTER a mais. Assim sendo, o primeiro ENTER que vc deu manualmente enviou o número 7. Mas o ENTER extra enviado pelo serial monitor resultou no valor 0.
Aquele Serial: 1 indica que houve algo na serial, pois vc pediu o comando serial.available()
Em resumo: deixe o serial monitor em NO LINE ENDING (NENHUM FINAL DE LINHA) e seja feliz
Por curiosidade: experimente enviar o A1B2C3 e dê enter e veja o resultado. Há descarte de letras e após cada número vê-se que houve um enter automárico
Oi Imhugo e Mauricio, bom dia.
Muito obrigado pela ajuda e explicações.
Realmente é curioso, testei com NO LINE ENDING, e funcionou.
Com A1B2C3 realmente aconteceu varios "enter".
O resultado foi :
Digite um valor : (Digitei A1B2C3)
Serial : 1 <-----
valor : 1
Serial : 1 <-----
valor : 2
Serial : 2 <-----
valor : 3
Vou procurar na documentação do Arduino sobre serial para entender melhor o porque dos "enter"
http://arduino.cc/en/Reference/HomePage
Novamente obrigado.
Rui
Lhe falei.
a função Serial.parseInt(), retorna os inteiros e as letras são como espaços, esta é a forma de separar numeros de letras e para cada separação um enter.
abs
Maurício Ortega
Caro Rui e amigos, somente com o proposito de ilustrar esta postagem que como todas abre mais um porta para o conhecimento de todos, já que enriquece a todos, os que já conhecem refrescam seu conhecimento, e aqueles que não, aprendem, coloquei um vídeo cujo link segue abaixo apenas para ilustrar o exposto aqui, para que fique documentado em forma de exemplo pratico para todos que procurarem na rede sobre este assunto uma resposta, já que tenho certeza que muitos não conhecem a opção NO LINE ENDING, e para aqueles que a descobrem pode ser a solução de um problema, e se não, um grande aprendizado.
Tomei a liberdade de elaborar e publicar o vídeo, mas caso exista qualquer objeção, fico a disposição para modificar total ou parcialmente o conteúdo do mesmo, ou se fosse o caso apaga-lo.
https://www.youtube.com/watch?v=8I68QwYOtQ4&feature=youtu.be
Abs.
Oi Imhugo.
Não encontrei a explicação específica no http://arduino.cc/en/Reference/HomePage,
Então resolvi mudar a função de serial.parseInt() para serial.read() e foi possível ver os valores em
decimal equivalente ao hexa que a serial envia com cada opçao:
1. No ending line ----- sómente os dados um por vez
2. Newline -------------- os dados um por vez + Dec10 (ASCII hexa A, line feed)
3. Carriage return ---- os dados um por vez + Dec13 (ASCII hexa D, carriage return)
4. Both NL & CR ---- os dados um por vez + Dec13 + Dec10
(ASCII hexa D, carriage return + hexa A, line feed)
(ordem invertida).
Muito obrigado pela ajuda.
Rui
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por