Pages: [1] 2   Go Down
Author Topic: RESOLVIDO: Receber e tratar dados?  (Read 3196 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas cara amigos,

Tenho ja alguma experiência com PICs ( pic basic pro ) mas a pouco e pouco esta a me render a estes "bixinhos" smiley leia-se arduinos, espero a vossa melhor compreensão nas minhas duvidas de iniciante.
Gostaria da vossa ajuda (pequeno código exemplo desde o inicio) para guardar e tratar dados provenientes   do serial monitor no ide do arduino.

Exemplo:

 Envio do s.m.   ;1234;5678 guardar o recebido e depois tratar ou seja saber que números estão nas 4 premiras posições, detectar o ";" como separação e inicio dos dados e depois tipo se os primeiros 4 numeros recebidos for 1234 envia para  o s.m. um "OK".

( Eu sei fazer tudo isto em pic basic pro )


Muito obrigado a todos

Paulo
« Last Edit: February 21, 2012, 07:05:03 pm by camolas » Logged

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

Exemplo 1;
Code:
void loop() {


if (Serial.available() > 3) {//temos dados que chegue:
   if (Serial.read () == '1') {
      if (Serial.read () == '2') {
          if (Serial.read () == '3') {
             if (Serial.read () == '4') {
                 LCD.print("OK");
             }
          }
      }
   }
}
}   

segundo exemplo

Code:
char pass [5];
int data;
void loop() {

if (Serial.available() >8) { //assumir que o outro byte vem a caminho.
    for (int i = 0; i<4; i ++) {
      pass[i] = Serial.read();
    }
    pas[4] = '\0'; //end string
    if ((strcmp(pass, "1234" == 0) && (Serial.read() == ';')) {//equal and the separator is good
       for (i = 0; i< 4; i++) {
           pass[i] = Serial.read(); } //get the number.
       data = atoi(pass);
       LCD.print( "OK ");
       LCD.print(data);

    } else {
        LCD.print("FAIL");
        }
   
}

Existem mais maneiras e maneiras mais eficientes de enviar dados... mas dão mais trabalho em ambos os lados da comunicacão.
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).

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas,

Antes de mais muito obrigado pela rápida resposta, o exemplo 2 é de facto o que necessito.
Tenho alguns erros ao compilar:

pas[4] = '\0'; //end string    modifiquei para   
pass[4] = '\0'; //end string  julgo ser um lapso de escrita??

if ((strcmp(pass, "1234" == 0) && (Serial.read() == ';')) {//equal and the separator is good     modifiquei para
if ((strcmp(pass, "1234" == 0) && (Serial.read() == ';'))) {//equal and the separator is good    apenas julgo que faltava mais um )

for (i = 0; i< 4; i++) {       agora este erro não sei como resolver ??


Peço uma vez mais aos Gurus ajuda.

Obrigado

Paulo


Logged

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

Eu respondi à pressa.... desculpa:

Code:
if ((strcmp(pass, "1234") == 0) && (Serial.read() == ';')) {

Code:
for (int i = 0; i< 4; i++) {

É assim que resolves o problema.
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).

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas,

Antes de mais muito obg pela atenção. O código não esta a funcionar e é pouco preciso ao inserir os números no terminal do arduino (ou seja nem sempre responde com o "FAIL" ) o  "PASS OK!" que deveria sair quando eu enviasse ;1234 nao sai mesmo tentei enviar de varias formas ex. 1234 ou 1234; ou ;1234 ou ;1234;5678  mas nada aqui fica o codigo completo por favor alguem o teste para ver o que fiz de errado.

Code:
char pass [5];
int data;

void setup()
{
  //Create Serial Object
  Serial.begin(9600);
  Serial.println("ARDUINO ON!");
}

void loop() {
 
 if (Serial.available() >8) { //assumir que o outro byte vem a caminho.
    for (int i = 0; i<4; i ++) {
      pass[i] = Serial.read();
    }
    pass[4] = '\0'; //end string
    if ((strcmp(pass, "1234") == 0) && (Serial.read() == ';')) {//equal and the separator is good
 
       for (int i = 0; i< 4; i++) {
           pass[i] = Serial.read(); } //get the number.
       data = atoi(pass);
       Serial.println("PASS OK!");
       Serial.println(data);
    } else {
       Serial.println("FAIL");
        }
   } 
}


Obrigado

Paulo
Logged

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

Esta linha:

Code:
if (Serial.available() >8) { //assumir que o outro byte vem a caminho.

Indica que precisas de ter 8 bytes disponíveis no buffer para o programa funcionar. O programa vai bloquear e falhar se não tiver 9 bytes no buffer... ou seja, o que tu especificaste no início... 1234;2345. Envia uma string no formato XXXX;YYYY toda seguida e vais ver que funciona. Outra coisa a teres em atencão é se o Arduino enviar um indicador de fim de linha ,isso também vai confundir o código e apenas funcionar uma vez.

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

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

if (Serial.available() >smiley-cool { //assumir que o outro byte vem a caminho.
Você está mandando 1234; ou ;1234 e esperando que haja 8 caracteres disponíveis para entrar no IF.
Tente mandar 1234;000 ou mude para 4 ou 5 se pretende mandar o ; também




Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas,

O bug é quando insiro uma pass errada ex: 2222;4444 o código fica "bloqueado" e ao inserir a pass correcta 1234;5678 ele devolve "FAIL" , por favor testem.

Obrigado,

Paulo
Logged

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bom acho que entendi o problema, falta você remover todos os caracteres que recebeu da serial no primeiro envio e quando há "fail".
Pois se no segundo if do seu código se der "fail" os caracteres recebidos restantes, ficaram no buffer, criando lixo para a próxima vez que ler o buffer.
Bom, não tenho o Arduino para testar aqui, mas acho q após o "fail" você faz:
Code:
   .
   .
   .
else {
       Serial.println("FAIL");
       while(serial.avalaible()>0)
              {
              serial.read(); // Tira todos os caracteres do buffer.
              }
       }
ou
Code:
   .
   .
   .
else {
       Serial.println("FAIL");
       Serial.flush();
       }
Eu acho que o flush(), não é a função certa, mas fica como referência, a primeira opção é a que eu confiaria mais.

http://arduino.cc/en/Serial/Flush



Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado amigo mas nao funciona  smiley-cry  . Mais alguma ideia amigos?
Logged

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bom, se não resolver até eu consertar meu arduino, eu testo isso.
Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


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

Verificaste, como disse anteriormente, se é enviado um caracter de fim de linha? Na porta série do Arduino dá para escolher entre enviar caracteres ou não enviar nada. Escolhe não enviar nada.
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).

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Amigo, antes de TRATAR os dados no IF, manda para a serial o conteúdo da variável PASS, e verifica se está com o valor que você espera, se não estiver, vai saber o que está contido na variável e saber porque está dando erro...
Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Verificaste, como disse anteriormente, se é enviado um caracter de fim de linha? Na porta série do Arduino dá para escolher entre enviar caracteres ou não enviar nada. Escolhe não enviar nada.

Boas amigo,

Eu tenho enviado como "no line ending" é assim? mas da erro apos meter uma vez a pass errada.
Tou tramado com isto lol
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Amigo, antes de TRATAR os dados no IF, manda para a serial o conteúdo da variável PASS, e verifica se está com o valor que você espera, se não estiver, vai saber o que está contido na variável e saber porque está dando erro...

Boas amigo,

Code:
ARDUINO ON!

1234  // meti a pass correcta e como esperado deu ok
PASS OK!
5667 

4444  // meti a pass errada e como esperado deu fail
FAIL

;888 // aqui voltei a meter pass correcta e sempre a dar erro
FAIL
8123
FAIL

depois de meter uma pass errada ele n volta a fazer a leitura correcta
Logged

Pages: [1] 2   Go Up
Jump to: