Comunicação RF-Protocolo

Alterei no código que implementaste

unsigned int buf[3];

para:

unsigned char buf[3];

Já funciona desta forma.Obrigado pela ajuda!

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?

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:

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.

Pretendia colocar por exemplo no buf1[0]=11,buf1[1]=11 e buf1[2]=111.
Tentei implementar da seguinte forma:

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.

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:

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:

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();
        }
      }

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

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

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.

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?

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.

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.

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

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

Antes demais obrigado pelas respostas.
Este código continua a dar-me erro:

char temp[4];
temp[2] = '\0';

Este é o erro do compilador:error: expected constructor, destructor, or type conversion before '=' token
Relativamente ao que fabiohbm007 referiou e aplicando a meu caso fica:
Com a sequência "1111111"[ENTER]-1111111\r\n.O \r\n fica nas posições a seguir?E como posso limpar o buffer do \n\r?

vasr:
Antes demais obrigado pelas respostas.
Este código continua a dar-me erro:

char temp[4];

temp[2] = '\0';



Este é o erro do compilador:error: expected constructor, destructor, or type conversion before '=' token
Relativamente ao que fabiohbm007 referiou e aplicando a meu caso fica:
Com a sequência "1111111"[ENTER]-1111111\r\n.O \r\n fica nas posições a seguir?E como posso limpar o buffer do \n\r?

Mostra o código todo...

Eu tenho ideia que podes seleccionar se queres caracteres de fim de string na IDE do Arduino... Já viste isso?

Eu também tenho ideia que é possível faze-lo mas no entento dá-me o erro que referi.
Este é o código que tentei para executar o que referi anteriormente no novo protocolo que implantei;

unsigned char buf1[3];
char temp[4];
temp[2]='\0';//aqui dá erro

void setup(){
  Serial.begin(9600);
}

void loop(){
 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);
   }
}

Estou a tentar implementar novo codigo com a informação dada pelo usuário fabiohbm007 mas ainda sem sucesso.

É preciso saber programacão para se fazer algo... colar as coisas com cuspe não resulta.

unsigned char buf1[3];
char temp[4];
//temp[2]='\0';//aqui dá erro CLARO QUE DÁ!!!! ISTO POR ACASO É UMA FUNCAO?????

void setup(){
  Serial.begin(9600);
temp[2]='\0'; //E AQUI???? REPARA QUE NÃO dÁ ERRO... QUE ESTRANHO, NÉ??

}

void loop(){
 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);
   }
}

Eu tinha testado colocar onde o fizeste mas de outra forma, apenas não estava a entender o que pretendias ao colocar o '\0'. Terei mais cuidado em analisar o código, obrigado pela ajuda.

Se eu tiver de escrever um sketch que compila e faz exactamente o que pretendes para demonstrar algo, simplesmente não o farei.
Tem de haver um certo esforco da outra parte em entender as dicas que são dadas... Neste caso, colocaste grande parte do código dentro duma funcão. Porque é que não meteste aquela parte também?
E eu sei porquê. Não sabes o suficiente de programacão em C para perceber que atribuicões de valor tem de ser feitas dentro duma funcão. Isto é relativamente básico... e devias investir um pouco nisto antes de te meteres em coisas mais difíceis.

Se ficaste a entender que pretendo que me façam o código, é errado estou aqui para aprender. Apenas não entendi o '\0' e onde o devia por para compilar, meu erro foi não ter perguntado a sua utilidade pois sei programar o básico.
Estou com alguma dificuldade no input da porta série e tento perceber o seu funcionamento com o objetivo de implentar que pretendo.
O problema é o \r\n estar no buffer do arduino?Ou é outro tipo de problema?

dei uma olhada no seu historico, você está quebrando a cabeça com RF desde junho, fez crossposting, e nada?
Não estou te julgando, mas porque não começa a ler blogs por aí e tente entender como funciona o codigo dos outros, eu te postei um código master/slave que faz exatamente isso, fica verificando a serial, trata do \r e assim que vê \n trata os dados e prossegue o programa.
http://forum.arduino.cc/index.php?topic=180671.msg1344485#msg1344485

o setup() que configura o virtualwire eu modifiquei até funcionar corretamente, verifiquei no "saleae"(analizador lógico), te mandei um código 100% correto, você não reaproveitou nada dele? Não usou porque não sabia o que o código fazia. Faça funcionar uma parte por vez, primeiro a parte serial, depois a conversão em partes, depois o RF, e por ultimo junte tudo...