Go Down

Topic: Problema com Serial.Read (Read 1 time) previous topic - next topic

Luizin_pl

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.

neuron_upheaval

Code: [Select]

/* * * * * * *
* 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;
        }
    }
}

bubulindo

Não percebi para que é esse switch... :\

This... is a hobby.

HugoPT

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??
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

Eu costumo fazer algo do género:


Code: [Select]

#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.
This... is a hobby.

Luizin_pl

galera ja resolvi... daki a poco posto o jeito q fiz mas muito obrigado pela ajuda

neuron_upheaval

#6
Mar 06, 2014, 02:00 pm Last Edit: Mar 08, 2014, 05:25 am by neuron_upheaval Reason: 1
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.

Go Up