Comunicação RF-Protocolo

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

Sim já ando com este código a algum tempo, tive de refazer os objetivos. Tenho tentado seguir as sugestões que me são dadas,as que compreendo.
Também já li muita informação acerca mas não a tenho usado da melhor forma por falta de entendemento na sua totalidade.
Acerca do tópico que te referes, desde entao nunca entendi esta parte(extrado do código):

if (Serial.available()&&!enviar){
    byte temp=Serial.read();
      if (temp=='\n'){
        buf[i]='\0';
        enviar=1;
      }
    else{
    if((i<80)&&(temp!='\r')){
        buf[i++]=temp;
    }
    }
  }
 if (enviar){
  }

}

Nunca encontra o ‘\n’,ou seja enquanto i<80 faz o segundo “if”. Quando essa condição não se verificar o programa não faz nada.Estou enganado?

Acho que primeiro deve aprofundar seus conhecimentos, uma coisa importante é máquina de estados, isso ajuda muito a desmembrar as tarefas do programa, esse código que te passei tem um bugzinho, o tamanho da array errado, mas ão impede que o programa funcione, esse código tem alguns linhas que faz duas verificações/ações, isso ajuda a não torná-lo claro o suficiente. OK, você não entendeu o funcionamento mas ele funciona sim. Todo programa é fácil de fazer, basta enumerar as necessidades e limitações, quando diz quero "um programa que transmita comandos da serial por RF", a explicação é simples mas a implementação não. Vou dar uma clareada no algoritmo: -inicializa a serial -zera as variaveis

  • se não pode enviar, escuta a serial, se tem dado: se o dado for \n chegou o fim da mensagem, marca o fim da mensagem com \0, sinaliza que pode enviar. senão se o dado for \r descarta senão se o buffer não está cheio salva o dado no buffer

  • se pode enviar prepara os dados usando o buffer envia os dados aguarda o envio limpa o buffer zera as variaveis sinaliza que não pode enviar

-outras coisas podem ser colocadas em seguida que ele executará