Go Down

Topic: Time out informação RF (Read 2325 times) previous topic - next topic

vasr

Estou a implementar uma forma de se não receber nenhum retorno o programa faz um print de "Falha de comunicação".
Fiz esta código:
Code: [Select]
#include <VirtualWire.h>
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
char buf1[1];
int long dr=0;
int flagENVIO=0;
void setup(){
  Serial.begin(9600);
  vw_set_rx_pin(2);
  vw_set_tx_pin(4); 
  vw_setup(1000);
  vw_rx_start();
}
void loop(){
  byte b=Serial.read();
  if (b=='1') {
    buf1[0]=1;
    vw_send((uint8_t *)buf1,7);
    vw_wait_tx();
    flagENVIO=1;
    }
  if(vw_get_message(buf, &buflen))
  {
    Serial.println("Recebeu");
    flagENVIO=0;
    dr=0;
  }
  if(flagENVIO==1){
   dr++;
   if(dr>1000){
    Serial.println("Falha de comunicacao");
    flagENVIO=0;
    dr=0;
  }
  }
}

Problema:O programa assume sempre como condição verdadeira independentemente do valor que comparo no if(if(dr>1000)).Curioso quando coloco um print da variavel print na variável dr no loop funciona corretamente.
Devo estar a cometer algum erro mas qual?

bubulindo

Porque dizes que assume sempre?

o que vês quando fazes print da variável dr?
This... is a hobby.

vasr

Esta com um funcionamento estranho.
Quando coloco um print da variável dr no loop, incrementa corretamente e funciona como o esperado. Se retirar esse print, entra sempre no ciclo if indepedentemente do valor que comparo dr>1000.

bubulindo

Pelos vistos estás a trabalhar num projecto ultra-secreto e como tal não podes dar mais informacões para te ajudarmos.

Boa sorte. :)
This... is a hobby.

vasr

Respondi ao que perguntaste, dei a informação que me pediste. Se fui pouco explícito dizias e seria mais simples do que remeteres as coisas dessa forma.

bubulindo

Dissequemos então o que tu disseste...


Esta com um funcionamento estranho.

Isto é um dado adquirido. Se estivesse a funcionar, não estavas aqui.


Quando coloco um print da variável dr no loop, incrementa corretamente e funciona como o esperado. Se retirar esse print, entra sempre no ciclo if indepedentemente do valor que comparo dr>1000.

O loop tem várias instrucões lá dentro... quando dizes que colocas um print eu não faco ideia onde é que o colocaste, nem como o colocaste... logo é bastante claro também que preciso de mais informacão aqui...

O que eu disse originalmente parece-me ser bastante claro também.

Porque dizes que assume sempre?

Chegaste a ver se por algum acaso o timeout passava e tu não detectavas? Como eu referi, 1000 não é muito temp... é menos de um segundo...


o que vês quando fazes print da variável dr?

Isto é bastante explanatório... quando fazes print da variável dr o que é que vês no Serial monitor?? Custa muito tirar um print screen ou um copy/paste?

Daí ter respondido como respondi. Sem factos ou dados é impossível de dizer o que se passa ao certo. Dizeres que é um comportamento estranho a mim não me diz nada... eu não sei o que tu tomas por comportamento estranho e o que é estranho para ti pode ser naturalíssimo para mim.

Já tentaste, sei lá, aumentar esse 1000 para algo mais óbvio... tipo 10000? Porque não fazer isso com o millis(), por exemplo?
Se adicionas uma instrucão e isso funciona, o que pode estar a acontecer é tu aumentares o tempo de ciclo... que por sua vez atrasa esse teu timeout e te permite ver que está a funcionar.

Não leves a mal o que disse... mas tens de admitir que sem apresentares dados sobre o problema é difícil de fazer seja o que for.
Por vezes tenho dias em que estou mais paciente, noutros dias estou menos paciente... e pessoas a colocarem problemas aqui sem qualquer informacão ou sem darem informacão após pedirmos não ajuda à paciência de quem cá está. Só isso.
This... is a hobby.

hugo007

Infelizmente este tipo de situação (falta de informação dada por quem pede ajuda) é o prato do dia.
Até já pensei em escrever num notepad uma frases pré feitas para copiar colar nos posts para não perder muito tempo.
A minha sugestão a todos é lerem no fim o post ao qual estão a pedir ajuda e porem se do lado de quem quer ajudar

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

vasr

Acerca da falta de informação, pensei que seria a suficiente.
No programa que mostrei tem 3 clicos if, primeiro envia, segundo espera se existe informação no buffer e o terceiro caso envie começa a incrementar a variável dr.
Coloco um print como indico em seguida;
Code: [Select]
void loop(){
 byte b=Serial.read();
 if (b=='1') {
   buf1[0]=1;
   vw_send((uint8_t *)buf1,7);
   vw_wait_tx();
   flagENVIO=1;
   }
 if(vw_get_message(buf, &buflen))
 {
   Serial.println("Recebeu");
   flagENVIO=0;
   dr=0;
 }
 if(flagENVIO==1){
  dr++;
  if(dr>1000){
   Serial.println("Falha de comunicacao");
   flagENVIO=0;
   dr=0;
 }
 }
Serial.println(dr);//Print da variável dr
}

Deste modo vejo o incremento e não acontece "Falha de comunicação" pois não excede 1000. Quando retiro o print da variável, imprime sempre "Falha de comunicação".
Já alterei o valor do if para outros valores muito mais altos e a condição é sempre verdadeira.
Desde já obrigado pela ajuda.



bubulindo

Eu vejo um problema... que pode ou não explicar o que vês.

Tu dizes:

No programa que mostrei tem 3 clicos if, primeiro envia, segundo espera se existe informação no buffer e o terceiro caso envie começa a incrementar a variável dr.


A tua condicão de timeout comeca quando envias a tua trama... daí fazeres um set à tua Flag. Sendo assim, o teu contador tem de ser posto a zero nesta altura e não quando a condicão de timeout terminou. Ou seja isto:

Code: [Select]

void loop(){
  byte b=Serial.read();
  if (b=='1') {
    buf1[0]=1;
    vw_send((uint8_t *)buf1,7);
    vw_wait_tx();
    flagENVIO=1;
   dr=0; // METI AQUI!!!!!
    }
  if(vw_get_message(buf, &buflen))
  {
    Serial.println("Recebeu");
    flagENVIO=0;
    //dr=0;  // RETIREI DAQUI...
  }

De outra forma, o teu timeout em caso de falha de comunicacão nunca faz reset. Estás a ver o problema?
Se por algum motivo uma trama não chegar antes do dr chegar a 1000, o dr nunca é posto a zero e como tal, todas as outras tramas ou chegam instantâneamente (impossível) ou o if (dr>1000) será sempre verdadeiro.

Estás a ver o erro?

This... is a hobby.

vasr

Sim já entendi o erro, falta de atenção. Obrigado pela atenção.
Fiz pelo millis() como referiste, deixo aqui o código:
Code: [Select]
#include <VirtualWire.h>
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
char buf1[1];
unsigned long tempo;
unsigned long tempo1;
int long dr=0;
int flagENVIO=0;
int flagSTART=0;
void setup(){
  Serial.begin(9600);
  vw_set_rx_pin(2);
  vw_set_tx_pin(4); 
  vw_setup(1000);
  vw_rx_start();

}

void loop(){
  byte b=Serial.read();
  if (b=='1') {
    buf1[0]=1;
    vw_send((uint8_t *)buf1,7);
    vw_wait_tx();
    flagSTART=1;
    }
  if(vw_get_message(buf, &buflen))
  {
    Serial.println("Recebeu");
    flagENVIO=0;
  }
  tempo=millis();
  if(flagSTART==1){
   tempo1=tempo;
   flagSTART=0;
   flagENVIO=1;
  }
  if((tempo-tempo1>1000)&&(flagENVIO==1)){
    Serial.println("Falha de comunicacao");
    flagENVIO=0;
  }
  }

De ambas qual é a mais correta?

bubulindo

O millis garante uma certa temporizacão... um contador não.
This... is a hobby.

Go Up