Pages: [1]   Go Down
Author Topic: Problema com Serial.Read  (Read 1111 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Online Online
Faraday Member
**
Karma: 42
Posts: 3225
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

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).

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1545
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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??
Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Online Online
Faraday Member
**
Karma: 42
Posts: 3225
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu costumo fazer algo do género:


Code:
#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.
Logged

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).

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: March 07, 2014, 11:25:48 pm by neuron_upheaval » Logged

Pages: [1]   Go Up
Jump to: