Galera, gostaria de fazer um programa que recebesse um número pela porta serial de uns 3 digitos por exemplo e então armazenasse esse valor em uma variável do tipo int, ja tentei de várias formas mas ele sempre armazena somente o último dígito.
/* * * * * * *
* Le inteiro de varios digitos e guarda
* Autor: Marcelo Shiniti Uchimura
* Data : 29/maio/2012
*/
int valor = 0;
void setup() {
Serial.begin( 9600 );
}
void loop() {
if ( Serial.available() > 0 ) {
byte recebido = Serial.read();
switch ( recebido ) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
valor = valor * 10 + (recebido - 0x30);
break;
default:
Serial.print( "Valor: " );
Serial.println( valor );
valor = 0;
break;
}
}
}
Não percebi para que é esse switch... :\
Bom devo concordar que esse Switch nao fará o que é perguntado pelo colega. Qual é a idea desse Switch?
Eu faria dessa forma.Se nao sabes quantos digitos iras receber usa um while e armazena o que os dados dentro de um array.Quando o while deixar de ser verdadeiro(fim de dados no buffer Serial) e so tratar eles.Agora uma pergunta os digitos que intruzes sao o int final que desejas?
exemplo escreves 3 depois 4 e depois 5, queres um int com valor 354??
Eu costumo fazer algo do género:
#include <stdlib.h> //atoi()
//unsigned int leva aproximadamente 65000 -> 6 caracteres.
char numero[6];
char recebido=0, ptr =0;
int resultado = 1 ;
numero[5] = '\0'; //terminador
while (ptr < 6) {
recebido = Serial.read();
if (recebido < '0' || recebido > '9') {
numero[0] = 0;
numero[1] = '\0';
break; //get out.
}
numero[ptr++] = recebido;
}
numero[ptr] = '\0';
resultado = atoi(numero);
Serial.print(resultado);
Faltam testes para garantir que isto não dá para o torto, mas é mais ou menos assim.
galera ja resolvi... daki a poco posto o jeito q fiz mas muito obrigado pela ajuda
Esse switch serve no lugar do teu if (numero < '0' || numero > '9'), bubulindo. Se o pá digitar alguma coisa diferente de 0 a 9, ele cai no caso default do switch e mostra o número armazenado.
Enquanto ele não digitar nada estranho, o programa anda a armazenar os dígitos, sem a necessidade de usar matemática de ponteiro nem vetor, nem terminação de string. Isso tudo é de uma complexidade desnecessária pra quem mexe com Arduino.
É óbvio que se o pá digitar "70000" vai acontecer estouro, mas eu acredito e rezo que esse fluxo alternativo não vá acontecer com o OP.
Também não usei o atoi() porque gosto de evitar coisas que não conheço bem e não faço ideia de como a biblioteca foi implementada. Já agora, por falar nisso, teu programa tem um defeito: se a pessoa digitar "10a" ou "a", que seja, tu estás a preencher o vetor com dois caracteres NUL nas posições zero e um dele, ou seja, está passando uma string vazia ao atoi(): resulta em boom.