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... :\

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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