RFID Tag ID

Bom dia, este é meu primeiro post no forum, e venho pedir ajuda se alguém já tiver feito algo parecido ou puder ajudar de alguma forma.
Tenho neste momento um modulo RFID UART RDM630 em mãos e pretendia escrever um codigo que permitisse identificar um cartao de forma a permitir ou não o acesso do mesmo.

Após algumas pesquisas consegui elaborar ate agora o seguinte codigo:


#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); //pin2 Rx, pin3 Tx
byte data[5];
int val = 0;

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

Serial.write(0x??); //Header
Serial.write(0x??); //Reserved
Serial.write(0x??); //Length (Command + Data)
Serial.write(0x??); //Command (0x87 sets auto mode behavior
Serial.write(0x??); //Data 1: Enable Auto-Read
Serial.write(0x??); //Data 2: Mode – Parity decoded – Manchester RF/64
Serial.write(0x??); //Data 3: Total number of block to be read (2)
Serial.write(0x??); //Data 4: No password expected
Serial.write(0x??); //Data 5: Password byte 1
Serial.write(0x??); //Data 6: Password byte 2
Serial.write(0x??); //Data 7: Password byte 3
Serial.write(0x??); //Data 8: Password byte 4
Serial.write(0x??); //Checksum

delay(500);
Serial.flush();
Serial.println();
Serial.println("Modulo RFID pronto! Aguarda passagem do cartão...");
}

void loop()
{
val = Serial.read();
while (val != 0x29)
{
val = Serial.read();
delay(1000);
}

//we already read the header (0xff)
Serial.read(); // reserved
Serial.read(); // length
Serial.read(); // command (indicates tag data)
data[0] = Serial.read(); // we read data 1
data[1] = Serial.read(); // we read data 2
data[2] = Serial.read(); // we read data 3
data[3] = Serial.read(); // we read data 4
data[4] = Serial.read(); // we read data 5
Serial.read(); // checksum

// Indentifica RFID Card
Serial.print("Card found - Code: ");
for (int i = 0; i<5; i++)
{
if (data < 16) Serial.print("0");
_ Serial.print(data*, HEX);_
_
}_
_
Serial.println();_
_
}_
_
---------------------------------------------*_
A duvida persiste no facto de não conseguir obter os valores correctos para colocar no serial.write que seria o ID do cartao(acho eu)
Ainda estou no inicio por isso ainda não percebo muito mas agradecia alguma ajuda
Cumps

Talvez porque tu defines uma porta série (mySerial) e nunca a usas, estando sempre a usar a porta série do computador?

Entre outras coisas também não acho isto correcto:

delay(500);
Serial.flush();
Serial.println();
Serial.println("Modulo RFID pronto! Aguarda passagem do cartão...");

Para quê ai o flush?
Sabes o significado do flush?
Como o Bubulindo te disse tu criaste a serie virtual mas falas com o teu leitor RFID pela serie nativa.Assim sendo presuponho que o teu leitor RFID esta na serie nativa tu fazes o teu debug na virtual.Dai para que enviares para o modulo -> Serial.println("Modulo RFID pronto! Aguarda passagem do cartão...");
Lamento mas ele nao te percebe :slight_smile:

val = Serial.read();
while (val != 0x29)
{
val = Serial.read();
delay(1000);
}

Se nao sabes se tens dados para ler porque tentas ler?
Vamos supor que até chegou um byte com valor de 0x29, nao entras no while e começas a ler tudo como se ja tivesses tudo no buffer.Pois mas isso nao é verdade ja que esses bytes inda nao chegaram ...
Logo isto:

  //we already read the header (0xff)
  Serial.read();              // reserved
  Serial.read();              // length
  Serial.read();              // command (indicates tag data)
  data[0] = Serial.read();    // we read data 1
  data[1] = Serial.read();    // we read data 2
  data[2] = Serial.read();    // we read data 3
  data[3] = Serial.read();    // we read data 4
  data[4] = Serial.read();    // we read data 5
  Serial.read();              // checksum

Muito provavelmente nao vai dar em nada
Tens de entender que o cpu é mais rapido do que a comunicaçao serie e portanto tentares ler a serie como se todos os bytes ja la estejam é errado

Boas,

antes de mais agradeço a vossa disponibilidade para ajudarem... realmente o my serial não estará lá a fazer nd

como disse ainda estou num nivel muito basico lol o flush para ser honesto retirei de outro exemplo de codigo de RFID mas nao sei o que faz ao certo.

Neste caso:

val = Serial.read();
while (val != 0x29)
{
val = Serial.read();
delay(1000);
}

O valor até pode nao ser 29 mas segundo o que li o primeiro byte(header) será sempre o mesmo nos cartões dai a condição para ele so entrar se for detectado o byte correspondente( neste caso meti 29 mas só sabendo o ID do cartao e que consigo fazer isso)

Não sei se me estou a explicar bem? ou talvez esteja a complicar....

Talvez seja mais fácil começar pelo inicio...

Como ligaste o módulo RFID?

Que exemplo de código usaste? E porque o alteraste?

Boas, o RFID esta ligado a um arduino uno nas portas 2 e 3 para RX e TX. o modelo e o rdm 630.

O exemplo do codigo original e de outro modelo RFID RM125.

o codigo(original):

// Setting Auto Read Mode - EM4102 Decoded Mode - No password
// command: FF 01 09 87 01 03 02 00 10 20 30 40 37
Serial.write(0xFF); //Header
Serial.write(0x01); //Reserved
Serial.write(0x09); //Length (Command + Data)
Serial.write(0x87); //Command (0x87 sets auto mode behavior
Serial.write(0x01); //Data 1: Enable Auto-Read
Serial.write(0x03); //Data 2: Mode – Parity decoded – Manchester RF/64
Serial.write(0x02); //Data 3: Total number of block to be read (2)
Serial.write((byte)0x00); //Data 4: No password expected
Serial.write(0x10); //Data 5: Password byte 1
Serial.write(0x20); //Data 6: Password byte 2
Serial.write(0x30); //Data 7: Password byte 3
Serial.write(0x40); //Data 8: Password byte 4
Serial.write(0x37); //Checksum

So que neste exemplo o command(do cartao é este)... no modelo que estou a utilizar não sei se é assim esta sequencia tambem.