Ajuda ai - Serial.available() - leitura fragmentada da serial

O que esta errado?

Digito a palavra TESTANDO no Serial Monitor e clico "enviar", mas na hora do Arduino processar o código que escrevi usando a função Serial.available() o mesmo informa pro Arduino que tem apenas um caracter disponível na primeira passada no loop do programa.

O Arduino roda o loop do programa uma vez e mostra apenas a primeira letra "T" da palavra que esta no buffer. Ele tem que rodar uma segunda vez para completar a palavra, ai ele mostra de uma só vez o restante da palavra "ESTANDO".  

Resultado que aparece no Serial Monitor, rodando o programa abaixo e enviando a palavra TESTANDO para o Arduino processar.

Qtde caracteres a serem lidos na serial:1
Palavra do buffer: T

Qtde caracteres a serem lidos na serial:7
Palavra do buffer: ESTANDO

Já tentei de tudo q é forma e não estou conseguindo entender o pq?

Deem uma olhada no código abaixo:

char palavraSerial[20];
char caracterBufferSerial;
int qtdeCaracter;
int nI=0;
byte imprimePalavra=0;

void setup()
{
       Serial.begin(9600);
}

void loop()
{

       // Verifica quantos caracteres tem disponivel na serial para serem lidos
       qtdeCaracter= Serial.available();

      // Se existir algum informa na tela a quantidade
      if( qtdeCaracter > 0 )
     {

            Serial.print( "Qtde caracteres a serem lidos na serial:" );
            Serial.println( qtdeCaracter );
            delay( 2000 );
      }


     // Laço pra ler caracter por caracter e armazenar em uma matriz
     while( nI < qtdeCaracter )
     {
             // Lê o caractere da vez no buffer da serial
             caracterBufferSerial = Serial.read();

            // Monta a palavra que esta na serial dentro da matriz "palavraSerial[]"
            // caractere por caractere
            palavraSerial[nI] = caracterBufferSerial;

            // incremente o contador
            nI++;

            // Variavel de controle para impressão da palavra recebida pela serial
            imprimePalavra=1;

       }

      // Zera o contador após sair do loop acima

      nI=0;

      // Verifica se entrou no loop acima para imprimir a palavra recebida pela serial    
      if( imprimePalavra )
      {
              Serial.print( "Palavra do buffer: " );
              Serial.println( palavraSerial );
              Serial.println("");

              // Laço para zerar o conteúdo da matriz "palavraSerial"
              for( int nJ=0; nJ<20; nJ++ )
              {
                     // Zera a matriz "palavraSerial"
                     palavraSerial[nJ]=0;
              }

             // Após a impressão da palavra recebida na serial, desliga a variável de
            // controle de impressão
            imprimePalavra=0;

       }
}

Exibições: 1821

Responder esta

Respostas a este tópico

Ve este codigo e compara com o teu... basicamente fazem a mesma coisa... este esta a funcionar... ;)

void setup() {
Serial.begin(9600);
}

/**
* Função que lê uma string da Serial
* e retorna-a
*/
String leStringSerial(){
String conteudo = "";
char caractere;

// Enquanto receber algo pela serial
while(Serial.available() > 0) {
// Lê byte da serial
caractere = Serial.read();
// Ignora caractere de quebra de linha
if (caractere != '\n'){
// Concatena valores
conteudo.concat(caractere);
}
// Aguarda buffer serial ler próximo caractere
delay(10);
}

Serial.print("Recebi: ");
Serial.println(conteudo);

return conteudo;
}

void loop() {
// Se receber algo pela serial
if (Serial.available() > 0){
// Lê toda string recebida
String recebido = leStringSerial();

}
}

Valeu Pedro 

O seu funcionou sem problema, agora vou comparar com o meu pra saber o q q tava pegando.

Esse Arduino tem q fazer o q eu mando e não o q ele quer.... rrrssssss...

Cara..as vezes eu também acho que meu Arduino tem vida própria...rsrsrrsrs

Provavelmente e muito claro...(não vi seu código direito)..."println"(responsável pela quebra de linha) no lugar do simples "print"..

Abração e boa sorte!!!

Pois é Rubens,

Estou domando meu Arduino devagarzinho, afinal "AQUI QUEM MANDA SOU EU" hahahaha.

Quanto ao código dei uma otimizada como o Pedro sugeriu, separei em uma função, deixei o void loop enxuto, só quando tem algo na serial que vou pra função.

Mas o que tava pegando mesmo e pelo que entendi após várias pesquisas é que a função serial.available() tem q ter um retardo usando a função delay(), se não o Arduino atropela as informações que estão chegando na serial, vi em outras explicações que a velocidade de processamento do Arduino é bem superior ao processamento da porta serial. Bom pelo menos foi o que eu entendi.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço