Preciso de verificar os bytes que envio para o arduino para garantir que chegam corretos, para isso pretendo enviar um byte antes e comparar com o byte que tenho no arduino e se for igual a que recebo os bytes que pretendo no arduino se for diferente envia uma mensagem de erro para o pc novamente. De seguida conto os bytes que pretendo receber no arduino se não os receber todos dentro de um determinado tempo volta a enviar uma msg para o pc (1 byte) para enviar de novo e o arduino fica a espera do byte iniciar para comparar novamente e não a espera dos bytes para o programa. Se alguém me poder ajudar agradecia.

Exibições: 628

Responder esta

Respostas a este tópico

Ja tem um esboço do programa feito?

Manda aí que a gente completa!

union serial_super_data {   

unsigned long int_8_bytes;   

unsigned long read_byte[8];

} super_data;

// declaração das variáveis

void setup()   {                 

    pinMode(13, OUTPUT);  

   Serial.begin(9600);

}

void loop()                    

{  

// Função para receber os 8 bytes

...

 // Uso esses bytes para controlar uma saida

   }

}

Então vc precisa fazer uma verificação dos butes recebidos, né?

Bom, é pra isso que serve o checksum.

Podemos implementar um criando um protocolo. Vamos fazer o seguinte:

* Adicionar aos seus 8 bytes mais 2 bytes: 1 cabeçalho e 1 checsum

* O cabeçalho vem antes de todos os outros e tem sempre o mesmo valor (0x01, por exemplo)

* O checksum vai no final, e é o resultado da operação OU EXCLUSIVO entre todos os 9 bytes anteriores  

esquema do protocolo:

CABEÇALHO  BYTE_1  BYTE_2  BYTE_3  BYTE_4  BYTE_5  BYTE_6  BYTE_7  BYTE_8  CHECKSUM

O arduino le esses 10 bytes e faz o seguinte:

* Verifica se cabeçalho = 0x01, se não, pára de ler e retorna erro

* Realiza a operação OU EXCLUSIVO com os 9 primeiros bytes e se o resultado for diferente do byte CHECKSUM, retorna erro

* Se as duas verificações acima não deram erro, considera os bytes como válidos!

Essa é a lógica do programa, é algo assim que vc precisa??

Sim é isso, mas no cabeçalho vou usar 2 bytes, embora que nesta fase inicial posso usar só um para testar. De seguida vou precisar de mandar 12 bytes, de dados e por fim o checksum. Fiz um diagrama do meu projeto que podem ver na imagem que se segue:

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço