Go Down

Topic: Comunicação RF-Protocolo (Read 25236 times) previous topic - next topic

vasr

Obrigado pela ajuda, já esta funcional.

vasr

Esta a fazer o carregamento do buffer do lado do Master correto mas no Slave recebe outro tipo de informação.
Codigo do slave(estou só a imprimir o que recebe):
Code: [Select]
void loop(){
  if(vw_get_message(buf, &buflen))
  {
   for (int j = 0; j<7; j++) {
   Serial.print("buf[");
   Serial.print(j);
   Serial.print("] = ");
   Serial.println(buf[j]);
   }
  }
}


No master coloco:
buf1[0]=1;
buf1[1]=6;
buf1[2]=1;
buf1[3]=2;
buf1[4]=3;
buf1[5]=0;
buf1[6]=1;
E no slave recebo:
buf[0] = 1;
buf[1] = 0;
buf[2] = 6;
buf[3] = 0;
buf[4] = 1;
buf[5] = 0;
buf[6] = 2;

bubulindo

Mostra aqui o setup do receptor e transmissor e também o código do transmissor.

Ela está a intercalar zeros na mensagem... isso é estranho, mas como estas funcões são mais ou menos standard, creio que o problema estará fora da funcão. Então podes ser tu a intercalar os zeros sem querer, ou podem as configuracões não bater certo com os dois dispositivos.

This... is a hobby.

vasr

#18
Aug 11, 2013, 05:21 am Last Edit: Aug 11, 2013, 05:24 am by vasr Reason: 1
Alterei no código que implementaste
Code: [Select]
unsigned int buf[3];
para:
Code: [Select]
unsigned char buf[3];
Já funciona desta forma.Obrigado pela ajuda!

bubulindo

Eu duvido muito que funcione...

Repara...

unsigned char buf[3];

E nisto...

void loop(){
 if(vw_get_message(buf, &buflen))
 {
  for (int j = 0; j<7; j++) {
  Serial.print("buf[");
  Serial.print(j);
  Serial.print("] = ");
  Serial.println(buf[j]);
  }
 }
}

Estás literalmente a escrever e a ler algo que não tem lugar definido. Ou aumentaste o buf para 7?
This... is a hobby.

vasr

Eu deu-te o exemplo da alteração que bastava fazer no teu programa para que este funciona-se, o código que escrevi(código de receção) já foi referente a alteração que fiz para meu caso.
Esta linha de código dá erro a compilar:
Code: [Select]
temp[3] = '\0';
De qualquer forma obrigado pela obervação e ajuda referente ao tramanho do buf e a todas as minhas dúvidas postadas.

vasr

#21
Aug 11, 2013, 08:03 pm Last Edit: Aug 11, 2013, 08:15 pm by vasr Reason: 1
Pretendia colocar por exemplo no buf1[0]=11,buf1[1]=11 e buf1[2]=111.
Tentei implementar da seguinte forma:
Code: [Select]
unsigned char buf1[3];
if(Serial.available()>7) {
   memset(buf1, 0, 3);
   unsigned char buf1_ptr = 0;
   for(buf1_ptr=0;buf1_ptr<3;buf1_ptr++) {
     if(buf1_ptr<2){
       for(int i = 0; i<2; i++) {
         temp[i] = Serial.read();
       }
     }else{
         for(int i1 = 0; i1<3; i1++) {
         temp[i1] = Serial.read();
       }
     }
     buf1[buf1_ptr]=atoi(temp);
  }

Não esta a funcionar como prentendo,ou seja no primeiro input de uma sequência resulta.Nas seguintes, faz por exemplo: buf1[0]=111,buf[1]=111 1 buf[2]=111.O que esta errado?Estranho quando fecho e abro novamente o Monitor Porta série do compilador do Arduino volta ao funcionamento normal.

bubulindo


Eu deu-te o exemplo da alteração que bastava fazer no teu programa para que este funciona-se, o código que escrevi(código de receção) já foi referente a alteração que fiz para meu caso.
Esta linha de código dá erro a compilar:
Code: [Select]
temp[3] = '\0';
De qualquer forma obrigado pela obervação e ajuda referente ao tramanho do buf e a todas as minhas dúvidas postadas.


Dá erro? E que erro é esse? Importas-te de me dizer? É que no meu computador essa linha compila que é uma maravilha.

Não percebo o que pretendes com isto:

Code: [Select]
for(buf1_ptr=0;buf1_ptr<3;buf1_ptr++) {
      if(buf1_ptr<2){
        for(int i = 0; i<2; i++) {
          temp[i] = Serial.read();
        }
      }else{
          for(int i1 = 0; i1<3; i1++) {
          temp[i1] = Serial.read();
        }
      }
This... is a hobby.

vasr

Com a sequencia"1111111",fique assim:
buf1[0]=11,buf1[1]=11 e buf1[2]=111

bubulindo

O código que eu deixei serve para o que pretendes... com algumas alteracões bastante óbvias.

Code: [Select]

int buf[3];

char temp[4];

temp[2] = '\0';

if (Serial.available>5) { //6 caracteres...
unsigned char buf_ptr = 0;

   for (buf_ptr = 0; buf_ptr <3; buf_ptr++) { corre todos os elementos de buf.
      for(int i = 0; i<2; i++) { //lê para temporário...
         temp[i] = Serial.read();
      }
   buf[buf_ptr] = atoi(temp);
   }

}


Agora se queres enviar campos com tamanhos diferentes, vais ter de mudar o protocolo para enviar delimitadores de campo... ou adicionar poderes de leitura da mente para o Arduino conseguir adivinhar o que estás a querer enviar.

This... is a hobby.

vasr

Ja alterei o protocolo,pretendia que o buf1[2] carrega-se 3 numeros em vez dos 2 que as outras posições anteriores.
Não é possivel?

bubulindo

Tudo é possível... tens de criar essa excepcão no código... eu é que não estou aqui para te escrever um protocolo novo todos os dias por isso deixo isso para ti.

Apenas digo que tu estás a comecar pelo fim... primeiro define-se o que se quer, depois programa-se. Tu não definiste nada ainda e andas às voltas sem sair do sítio por causa disso.
Senta-te com uma folha de papel à frente. Lista o que pretendes transmitir e chega a um protocolo. Depois de tudo isso estar definido, pensa em programar.
This... is a hobby.

vasr

Tens razão mas não previa que precisaria de 3 numeros no assunto referido anteriormente. Não pretendo que me implementes código mas pelo menos que me indiques o caminho certo. Como observaste tentei refazer teu código em função do que pretendia.
De qualquer forma obrigado pela ajuda.

bubulindo


Tens razão mas não previa que precisaria de 3 numeros no assunto referido anteriormente.


Não previste isso porque não fizeste o exercício que te propus.

A mecânica de como fazer isto está toda no post que eu coloquei. O que pensas que vais poupar em mandar um numero com 3 digitos e os outros com 2, está errado porque fazes uma comunicacão rápida, mas perdes mais tempo a analisar a informacão que recebes e adicionas muito mais possibilidades de bugs ao fazer essa distincão.

Então a minha sugestão é planeares e definires o teu protocolo e comecar pelos exemplos que eu deixei. Depois de teres isso definido de vez, ajustes ao código são mais simples (porque serão, à partida, únicos).
This... is a hobby.

fabio_h

Falta a você conhecimento em array e a forma de envio de dados seriais,
todo array tem a obrigação de conter 0 (* zero em seu ultimo elemento, que no ultimo codigo você esqueceu, a função atoi() só vai parar de ler quando encontrar um NULL byte que é o zero...

No windows, mais precisamente no Serial monitor do arduino, sempre que aperta ENTER, ele manda os caracteres digitados, seguidos de '\r' '\n' que simbolizam os bytes 13 e 10,
exemplo:
quero enviar HELLO [enter] ---> vai sair  H E L L O \r \n.
no seu ultimo programa  até funciona certo na primeira vez, na proxima não porque você esqueceu que o \r \n está tambem no buffer do arduino. Seu codigo não previa o tratamento de caracteres não-numericos...

Go Up