• Welcome to LusoRobótica - Robótica em Português.
 

serial.read() dois digitos

Started by GSI2, 21 de April de 2011, 18:07

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

GSI2


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

amando96

Como estás a enviar?

E os números assim são vistos como números ou characteres?

GSI2

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.

senso

Fazes algo assim:

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

GSI2

sim compilava. Com o que escreveste é que não.

tinhas if(Serial.available>2){
falta os ()
mudei para if (Serial.available() > 2){ já dá.

mas para aqui
       numero1 = atoi(get, 10); } [code]
error: invalid conversion from 'int' to 'const char*'

senso

Troca uint8_t numero1, numero2; por int numero1, numero2;
Avr fanboy

GSI2

Troquei dá o mesmo erro  :'(

o atoi() não me aparece com outra cor será que preciso de adicionar alguma livraria?

senso

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

GSI2


senso

Esquece, paragem mental completa -.-
a função atoi é só atoi(get); tira a virgula e o 10.
Avr fanboy

GSI2


StarRider

#11
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

senso

Ok, horas de ir para a cama lol
Avr fanboy

StarRider

#13
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