Boa tarde pessoal! Estou criando um leitor de RFID e enviando para um computador. Olhando no wireshark e depurando o pacote que recebo, percebo que o numero do cartão está vindo ora completo, ora fragmentado.

Segue o codigo:

https://pastebin.com/i3k7kur8

Exibições: 790

As respostas para este tópico estão encerradas.

Respostas a este tópico

Já tentou enviando com o :  Udp.write(String);   ?

Olhei num projeto antigo aqui e vi que nele faço o envio com o write ao invés do print. Não tive esse problema não. Lembro que também utilizei o WireShark para conferir.

Nesse caso, o metodo write() espera um char[] ou byte, e nao string

Tentou converter e testar ?  Existe a função para conversão :  toCharArray

Acabei de testar, estou tendo o mesmo resultado. Sera que esses numeros fragmentados nao são devido a leitura da antena?

Estranho...   Não tenho mais esse material pra testar. Caso não consiga resolver, o que você pode tentar fazer é criar uma espécie de "miniprotocolo" pra lidar com esse envio e recepção dos IDs. Por exemplo, um caractere que simbolize o fim e outro, o início de um ID.

Exemplo: 

ID:  0123456

ID_send = $0123456#

Ao receber, seu código trata sabendo que o "$" significa o início de um ID e vai concatenando o que receber enquanto não chegar um "#" ou estourar um limite de chars na string. Caso venham separados, ele vai juntando até o final (#). Como os IDs possuem tamanhos fixos, você pode conferir se o tamanho da string recebida tem o valor correto.

Verdade, isso seria um controle, quando eu coloco pra jogar no monitor serial, ele realmente aparece fragmentado, isso ja na propria leitora, igual na imagem acima. No software que irá receber esse codigo, ele verifica se o pacote recebido, tem 13 bits. Se sim, ele faz a tratativa e converte para decimal.

Qual frequencia e protocolo do leitor?!

Wiegand ?

Mifare ?

Estou usando cartão Acura 125khz protocolo RS232

Ola.

Nunca usei, achei interessante o metodo.

Tenho um palpite:

Por definição o utp manda blocos de streaming, byte apos byte. Será que ele não está fragmentando o bloco, que é uma caracteristica normal do protocolo. Inclusive roteadores podem fragmentar blocos.

Ref:

https://en.wikipedia.org/wiki/IP_fragmentation

No tcp vc recebe o bloco sempre desfragmentado pq o protocolo cuida disso pra vc, mas no udp não.

Se for isso, 2 opções:

1) Fazer por TCP, o que me parece mais lógico. Vc usa toda a implementação de controle a seu favor.

https://www.arduino.cc/en/Tutorial/ChatClient

2) sempre que receber um pacote somar ao anterior, fazendo um linguição. Para localizar dentro desse pacote os blocos usar caracteres de terminação. Qualquer "\n" separa um do outro.

Boa tarde!!
O problema ja ocorre na leitura, ele le fragmentado/completo/fragmentado. Quando eu recebo o codigo completo, ou seja, 13bits faço a conversão e boa. Mas sera que isso nao esta acontecendo por problema de leitura?
tipo, o leitor le o cartao incompleto, fiz todos os testes. Tem uma condicional no programa que recebe esse numero e compara. De 10x lidos, 5 deles são válidos, ou seja, inteiros.

Boa tarde ES,

Como vc está afirmando que o erro já ocorre na leitura, e 

verifiquei no seu sketch, que vc está usando .read() para ler a serial, e em seguida concatenado 

o valor lido com o lido anteriormente. Certo? 

    while(mySerial.available())
     {

      char _cartaoChar = mySerial.read();
      _cartao.concat(_cartaoChar); 

    }

Como _cartao é uma string,

sugiro que você modifique o seu sketch para:

    while(mySerial.available())
     {

        _cartao = mySerial.readString();

    }

                                                                 

Testa ai e depois conta pra gente o resultado.

RV

Estou usando essa função, readString(), resolveu meu problema com fragmentação dos numeros. Mas agora, se eu manter o cartão proximo à leitora, ele le tudo o buffer e joga na variavel cartão. Então, fica com varios numeros repetidos. Dei uma olhada na internet, e achei a função readStringUntil(string), preciso fazer com que pare de ler o cartao, quando chegar no \u0003 que é o delimitador, mas nao esta funcionando. Teria uma outra sugestão?

Edit1 - Ja tentei usar o mySerial.readString().substring(1,13) mas tem um certo delay quando ele corta a string... Nao sei mais oque fazer =\

Edit2 - O cartão vem como o delimitador inicial e o final:

\u0002NUMERO_DO_CARTAO\u0003

Então, o certo seria ler do \u0002 ao \u0003, mas ele esta trazendo varias vezes o mesmo numero

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço