collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[Ontem às 15:31]


Arame de Estendal por almamater
[18 de Abril de 2024, 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

Autor Tópico: Manipulando dados inseridos via Serial Monitor  (Lida 11358 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Manipulando dados inseridos via Serial Monitor
« Responder #15 em: 29 de Janeiro de 2011, 00:28 »
Erro meu Junior, pensava que a função Serial.read() era bloqueante (que esperava que houvesse um caracter disponível para ler), mas não é. Neste caso precisas de trocar a linha

  byte  caracter = Serial.read();

por

  int  caracter;
  do { caracter = Serial.read(); } while (caracter == -1);

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Manipulando dados inseridos via Serial Monitor
« Responder #16 em: 29 de Janeiro de 2011, 00:30 »
Erro meu Junior, pensava que a função Serial.read() era bloqueante (que esperava que houvesse um caracter disponível para ler), mas não é. Neste caso precisas de trocar a linha

  byte  caracter = Serial.read();

por

  int  caracter;
  do { caracter = Serial.read(); } while (caracter == -1);
Não precisa de ser int para comparar com -1?
A minha sugestão é ler o Serial.available().

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Manipulando dados inseridos via Serial Monitor
« Responder #17 em: 29 de Janeiro de 2011, 00:38 »
Se olhares bem vais ver que (já) é int ;)
Usar a Serial.available() é outra solução.

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Manipulando dados inseridos via Serial Monitor
« Responder #18 em: 29 de Janeiro de 2011, 00:39 »
Se olhares bem vais ver que (já) é int ;)
Usar a Serial.available() é outra solução.
Opah, desculpa, vi à pressa...  :P

Metam um jump de dois posts anteriores para o próximo a este! xD

Offline Junior Frota

  • Mini Robot
  • *
  • Mensagens: 39
Re: Manipulando dados inseridos via Serial Monitor
« Responder #19 em: 29 de Janeiro de 2011, 14:53 »
Olá pessoal! Muito bom a ajuda que estão me dando, mais uma vez agradeço muito.

Eu fiz umas pequenas mudanças no código, ele ficou assim:

const int cTamanhoDoArray = 8;
char entrada[cTamanhoDoArray];
int x, y, z, a;

void setup(){
  Serial.begin(9600);
  Serial.println("Entre com um ponto (x, y, z, a): ");
}

void loop(){
  if (Serial.available()){   
    lerDados(',');
    x = atoi(entrada);
    lerDados(',');
    y = atoi(entrada);
    lerDados(',');
    z = atoi(entrada);
    lerDados('\n');   // na última coordenada, o que termina a entrada de dados do utilizador é a tecla ENTER e não uma virgula
    a = atoi(entrada);
   
    Serial.print("Ponto: ");
    Serial.print(x);
    Serial.print(",");
    Serial.print(y);
    Serial.print(",");
    Serial.print(z);
    Serial.print(",");
    Serial.println(a);
  }
}

void lerDados (uint8_t terminador){
  int  indice = 0;
  while (indice < cTamanhoDoArray - 1){
    byte  caracter = Serial.read();
    entrada[indice] = caracter;
    indice++;
    if (caracter == terminador){
      break;    // sair do ciclo while se o caracter lido for um ENTER
    }
    entrada[indice] = '\0';    // terminar a string, com o caracter nulo (0)
  }
}


eu acrescentei um teste para ver se as variáveis estavam realmente sendo lidas via teclado. O código funcionou bem, só com um pequeno problema, que eu acho que nem é preciso resolvê-lo: quando inicio o código pelo Arduino, na tela Serial Monitor é imprimida, inicialmente, a frase "Entre com um ponto (x, y, z, a): ", até aqui beleza, só que quando eu entro com as coordenadas do ponto, eu preciso acrescentar um zero antes da primeira coordenada para que seja lida corretamente. Se o problema puder ser solucionado, muito bom, se não, fico colocando o zero antes mesmo. hehehe

Uma amostra de como foi imprimido na janela:

Entre com um ponto (x, y, z, a):
Ponto: 0,0,0,0
Ponto: 10,10,20,30


Lembrando que foi preciso que eu digitasse 010,10,20,30 para que fosse reconhecido 10,10,20,30. Sendo assim, o código está funcionando beleza, mas se puder ser aprimorado, aceito ajuda.

Mais uma vez, muitíssimo obrigado.

Um abraço...

"Nossa maior fraqueza está em desistir. A forma mais certa de vencer, é tentar mais uma vez" (Thomas Edson)

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: Manipulando dados inseridos via Serial Monitor
« Responder #20 em: 29 de Janeiro de 2011, 15:57 »
E se não meteres o dito 0 o que acontece?
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Manipulando dados inseridos via Serial Monitor
« Responder #21 em: 30 de Janeiro de 2011, 00:36 »
Esqueceste-te de fazer esta alteração que indiquei anteriormente.

Erro meu Junior, pensava que a função Serial.read() era bloqueante (que esperava que houvesse um caracter disponível para ler), mas não é. Neste caso precisas de trocar a linha

  byte  caracter = Serial.read();

por

  int  caracter;
  do { caracter = Serial.read(); } while (caracter == -1);

Offline Junior Frota

  • Mini Robot
  • *
  • Mensagens: 39
Re: Manipulando dados inseridos via Serial Monitor
« Responder #22 em: 30 de Janeiro de 2011, 00:47 »
Beirao, se eu não colocar o zero, ele separa o primeiro algarismo da primeira coordenada.

Eu digito: 10,10,20,30 e quando teclo Enter, ele imprime assim:

Entre com um ponto (x, y, z, a):
Ponto: 1,0,0,0          // essa linha não era para existir
Ponto: 0,10,20,30          // está faltando o "1" do "10" que foi digitado

Ou seja, ele pega o primeiro algarismo da coordenada x e separa dos outros.

Honestamente não sei como ajeitar. Não vejo problema em ter que colocar um zero ou qualquer outro numero antes das coordenadas, mas se puderem me ajudar, estarei grato.

Njay, em que parte do código devo colocar o que você me mandou? Pois quando, simplesmente substituí uma coisa pela outra, o programa não apresentou resultado, ele passou a misturar algumas coordenadas.

Um abraço...
"Nossa maior fraqueza está em desistir. A forma mais certa de vencer, é tentar mais uma vez" (Thomas Edson)

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
Re: Manipulando dados inseridos via Serial Monitor
« Responder #23 em: 30 de Janeiro de 2011, 13:27 »
O que o Njay disse para fazeres foi:

const int cTamanhoDoArray = 8;
char entrada[cTamanhoDoArray];
int x, y, z, a;

void setup(){
  Serial.begin(9600);
  Serial.println("Entre com um ponto (x, y, z, a): ");
}

void loop(){
  if (Serial.available()){   
    lerDados(',');
    x = atoi(entrada);
    lerDados(',');
    y = atoi(entrada);
    lerDados(',');
    z = atoi(entrada);
    lerDados('\n');   // na última coordenada, o que termina a entrada de dados do utilizador é a tecla ENTER e não uma virgula
    a = atoi(entrada);
   
    Serial.print("Ponto: ");
    Serial.print(x);
    Serial.print(",");
    Serial.print(y);
    Serial.print(",");
    Serial.print(z);
    Serial.print(",");
    Serial.println(a);
  }
}

void lerDados (uint8_t terminador){
  int  caracter, indice= 0;
  while (indice < cTamanhoDoArray - 1){ 
    do {
         caracter = Serial.read();
         } while (caracter == -1);
    entrada[indice] = caracter;
    indice++;
    if (caracter == terminador){
      break;    // sair do ciclo while se o caracter lido for um ENTER
    }
    entrada[indice] = '\0';    // terminar a string, com o caracter nulo (0)
  }
}
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline Junior Frota

  • Mini Robot
  • *
  • Mensagens: 39
Re: Manipulando dados inseridos via Serial Monitor
« Responder #24 em: 31 de Janeiro de 2011, 21:57 »
beirao, eu já fiz o que o Njay pediu, mas não funcionou. Você já testou esse código? Ele apresenta um comportamento estranho. Vou tentar descrever:

1º - Quando a gente coloca ele pra rodar e insere os dados, primeiramente ele não reage a nada;
2º - Tentando entrar com os dados novamente, ele imprime as coordenadas de forma misturada, assim:

Eu digitei uma vez "10,20,30,40" e não aconteceu nada, digitei novamente "10,20,30,40" e aparecei isso:

Entre com um ponto (x, y, z, a):
Ponto: 10,20,30,4010


Quando eu tinha apenas que digitar o zero antes da primeira coordenada, dava certo, ele reconhecia as 4 variáveis de forma independente e sem misturar.

Vejamos se é possível concertar isso.

Um abraço...
"Nossa maior fraqueza está em desistir. A forma mais certa de vencer, é tentar mais uma vez" (Thomas Edson)

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Manipulando dados inseridos via Serial Monitor
« Responder #25 em: 31 de Janeiro de 2011, 22:01 »
Mas o serial.available retorna o tamanho do array de chegada, não pode simplesmente meter isso e esperar que funcione certo.
Pois tanto pode ter recebido só o 1 como ter recebido 10,2.
Avr fanboy

Offline Junior Frota

  • Mini Robot
  • *
  • Mensagens: 39
Re: Manipulando dados inseridos via Serial Monitor
« Responder #26 em: 31 de Janeiro de 2011, 22:30 »
Então senso, você tem alguma sugestão?

Pois já tentei de tudo quanto foi forma pra resolver esse problema, até o ponto de me contentar com o código que se precisa colocar o zero na frente do número, hehehe

Mas é isso mesmo, na vida, somos eternos aprendizes.

Sou professor de Física em uma escola pública aqui do Brasil e nesse ano eu gostaria de desenvolver um projeto voltado à Robótica educacional, sendo assim, vou tentar explicar o meu projeto:

Meu projeto constitui em criar um mecanismo de seleção de objeto por cores. Este mecanismo consiste em um braço mecânico e uma esteira rolante dotada de um sensor de cores.

Quando o objeto interceptar o sensor, ele identificará a cor e fará o braço leva-lo para um local determinado.

Sendo assim, o meu projeto em si, nem precisa tanto que eu entre com as coordenadas pelo Serial Monitor, mas preciso disso sim, para testar o alcance e poder determinar os locais de coleta dos objetos.

Eu estou trabalhando na construção do sensor de cores, já tenho os leds e os filtros RGBs, só preciso desenvolver o código, que julgo não ser tão difícil.

Então, é este o meu projeto. Preciso muito poder entrar com as coordenadas para poder testar o braço, só pra isso.

Então, se alguém puder me ajudar, muito obrigado.

Um abraço...
"Nossa maior fraqueza está em desistir. A forma mais certa de vencer, é tentar mais uma vez" (Thomas Edson)

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Manipulando dados inseridos via Serial Monitor
« Responder #27 em: 01 de Fevereiro de 2011, 00:11 »
Às vezes há algum "lixo" lido da porta série no arranque, aconselho a colocar o seguinte código no final da função setup(), para esvaziar o "buffer de entrada":

while (Serial.read() == -1);

Para ajudar na depuração do programa, sugiro esta nova função lerDados() que faz echo dos caracteres lidos, ou seja, quando digitas um carater no terminal esse caracter é lido no Arduino e o Arduino envia-o de volta para o PC e assim vês o caracter que o Arduino leu:

void lerDados (uint8_t terminador)
{
    int  caracter, indice = 0;

    while (indice < cTamanhoDoArray - 1)
    {
        do {
            caracter = Serial.read();
        } while (caracter == -1);
        Serial.write(caracter);   // ecoar o caracter lido de volta para o terminal
        entrada[indice] = caracter;
        indice++;
        if (caracter == terminador)
        {
            break;    // sair do ciclo while se o caracter lido for o 'terminador'
        }
        entrada[indice] = '\0';    // terminar a string, com o caracter nulo (0)
    }
}


Também pode haver problemas se o terminal estiver a enviar \n\r como terminador de linha; experimenta '\r' em vez de '\n' na leitura da última coordenada no teu programa.