Oi pessoal,

estou com uma dificuldade com a biblioteca Serial.

Ao tentar entender e ajudar o nosso amigo Felipe nos Post

(Motor de passo sem chave de fim de curso?), 

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

Exibições: 607

Responder esta

Respostas a este tópico

veja em: http://arduino.cc/en/Serial/available

Description

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

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço