LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: GSI2 em 21 de Abril de 2011, 18:07

Título: serial.read() dois digitos
Enviado por: GSI2 em 21 de Abril de 2011, 18:07
Código: [Seleccione]
void setup() {
  Serial.begin(9600);
}
int get;
void loop () {
      if (Serial.available()>0){
        get = Serial.read();
         switch (get) {
           case '1':
           // do something
           break;
           case '2':
           // do something
           break;
/* 3, 4, 5, 6, 7, 8... */
           case '20':
           // do something
           break;
           default:
           Serial.print("No command\n");
      }
    }
  }
Não sou programador nem nunca estudei algum tipo de linguagem comprei o meu Arduino ontem
e ao que parece o que quero fazer é perguntado quase todos os dias mas nunca vi um exemplo que funcione.
Por esse motivo peço se alguém pode fazer o favor de completar o code para que consiga trabalhar com números > 9.

Se envio 12 ele actua o 1 e o 2 mas não o 12 já li dezenas de tópicos e por mais que tente não consigo  :-[

Obrigado
Título: Re: serial.read() dois digitos
Enviado por: amando96 em 21 de Abril de 2011, 20:03
Como estás a enviar?

E os números assim são vistos como números ou characteres?
Título: Re: serial.read() dois digitos
Enviado por: GSI2 em 21 de Abril de 2011, 23:41
Estou a enviar através de php e tudo funciona bem
<?php
$arduino = $_GET["arduino"];
$fp = fopen('com3', 'w');
fwrite($fp, $arduino);
fclose($fp);
?>
o unico problema é que so consigo ler 1 numero de cada vez com o serial.read.
Título: Re: serial.read() dois digitos
Enviado por: senso em 21 de Abril de 2011, 23:52
Fazes algo assim:
Código: [Seleccione]
junto com as outras variaveis junta estas:
uint8_t numero1, numero2;

if(Serial.available>2){
for(uint8_t i=0; i<2; i++){
  get = Serial.read();
  if((get >= '0') & (get <= '9')){            //Ter a certeza que é um numero
    if(i==0){
       numero1 = atoi(get, 10); }      //Converter de ASCII para um inteiro
    else {
       numero2 = atoi(get, 10); }
  }
}
get=numero1 + 10*numero2;

Agora tens inteiros e não caracteres no teu switch, basta tirares os '' e deve funcionar, outra coisa esse código compilava mesmo?
É que regra geral '10' ou qualquer coisa que não seja só um caracter o gcc queixa-se.
Título: Re: serial.read() dois digitos
Enviado por: GSI2 em 22 de Abril de 2011, 01:23
sim compilava. Com o que escreveste é que não.

tinhas
Código: [Seleccione]
if(Serial.available>2){falta os ()
mudei para
Código: [Seleccione]
if (Serial.available() > 2){ já dá.

mas para aqui
Código: [Seleccione]
       numero1 = atoi(get, 10); } [code]
error: invalid conversion from 'int' to 'const char*'
Título: Re: serial.read() dois digitos
Enviado por: senso em 22 de Abril de 2011, 01:27
Troca uint8_t numero1, numero2; por int numero1, numero2;
Título: Re: serial.read() dois digitos
Enviado por: GSI2 em 22 de Abril de 2011, 01:30
Troquei dá o mesmo erro  :'(

o atoi() não me aparece com outra cor será que preciso de adicionar alguma livraria?
Título: Re: serial.read() dois digitos
Enviado por: senso em 22 de Abril de 2011, 01:33
Pois, provavel, nem me lembrei disso, falta de hábito, no inicio do programa, logo na primeira linha mete isto:
#include <stdlib.h>
Título: Re: serial.read() dois digitos
Enviado por: GSI2 em 22 de Abril de 2011, 01:48
continua a dar o mesmo erro  :-[
Título: Re: serial.read() dois digitos
Enviado por: senso em 22 de Abril de 2011, 01:53
Esquece, paragem mental completa -.-
a função atoi é só atoi(get); tira a virgula e o 10.
Título: Re: serial.read() dois digitos
Enviado por: GSI2 em 22 de Abril de 2011, 02:09
mesmo erro  :-[
Título: Re: serial.read() dois digitos
Enviado por: StarRider em 22 de Abril de 2011, 02:16
Boas,

A função atoi() espera uma string no primeiro parâmetro, não um char como estás a passar, alem de que as dezenas estão a ser mal calculadas pois é usado o segundo carácter que é o das unidades.

Experimenta:

chars = Serial.available();
get   = 0;
while (chars)
    get += ((Serial.read()-'0') * (int) powl(10,--chars)));

... partindo do principio que o arduino "entende" a função powl(), se não entender podes sempre fazer a tua, é simples pois basta elevar 10 à potencia do segundo parâmetro. Se achares necessário podes ainda adicionar uma condição para testar se todos os caracteres são numéricos.

Abraços,
PA
Título: Re: serial.read() dois digitos
Enviado por: senso em 22 de Abril de 2011, 02:24
Ok, horas de ir para a cama lol
Título: Re: serial.read() dois digitos
Enviado por: StarRider em 22 de Abril de 2011, 02:32
Boas,

Ainda outra forma, mais no estilo "força bruta", de chegar ao mesmo resultado:

char lido[5];
chrcount = Serial.available();
lido[chrcount]=0;
for (int n=0 ; n<chrcount; n++)
    lido[n]=Serial.read();
get = atoi(lido);


Abraços,
PA