collapse

* Links de Robótica

* Posts Recentes

Ajuda Projecto IR / RF por Njay
[Hoje às 00:03]


Recomendação de um opamp para um DAC r2r por jm_araujo
[Ontem às 23:05]


Ideias para construir um quadrúpede simples por dropes
[Ontem às 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]


Amplificador audio por beirao
[12 de Novembro de 2017, 23:43]


Power_OK Enermax por edeweld
[12 de Novembro de 2017, 17:15]


Driver motor por beirao
[11 de Novembro de 2017, 17:40]

Autor Tópico: serial.read() dois digitos  (Lida 1714 vezes)

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

Offline GSI2

  • Mini Robot
  • *
  • Mensagens: 8
serial.read() dois digitos
« 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

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: serial.read() dois digitos
« Responder #1 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?

Offline GSI2

  • Mini Robot
  • *
  • Mensagens: 8
Re: serial.read() dois digitos
« Responder #2 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.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: serial.read() dois digitos
« Responder #3 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.
Avr fanboy

Offline GSI2

  • Mini Robot
  • *
  • Mensagens: 8
Re: serial.read() dois digitos
« Responder #4 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*'

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: serial.read() dois digitos
« Responder #5 em: 22 de Abril de 2011, 01:27 »
Troca uint8_t numero1, numero2; por int numero1, numero2;
Avr fanboy

Offline GSI2

  • Mini Robot
  • *
  • Mensagens: 8
Re: serial.read() dois digitos
« Responder #6 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?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: serial.read() dois digitos
« Responder #7 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>
Avr fanboy

Offline GSI2

  • Mini Robot
  • *
  • Mensagens: 8
Re: serial.read() dois digitos
« Responder #8 em: 22 de Abril de 2011, 01:48 »
continua a dar o mesmo erro  :-[

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: serial.read() dois digitos
« Responder #9 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.
Avr fanboy

Offline GSI2

  • Mini Robot
  • *
  • Mensagens: 8
Re: serial.read() dois digitos
« Responder #10 em: 22 de Abril de 2011, 02:09 »
mesmo erro  :-[

StarRider

  • Visitante
Re: serial.read() dois digitos
« Responder #11 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
« Última modificação: 22 de Abril de 2011, 02:22 por StarRider »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.401
  • Helpdesk do sitio
Re: serial.read() dois digitos
« Responder #12 em: 22 de Abril de 2011, 02:24 »
Ok, horas de ir para a cama lol
Avr fanboy

StarRider

  • Visitante
Re: serial.read() dois digitos
« Responder #13 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
« Última modificação: 22 de Abril de 2011, 02:37 por StarRider »