Skip to content

Instantly share code, notes, and snippets.

@trytone
Last active April 24, 2023 20:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trytone/ea2a5010cab79e4c608e8034f7f87e72 to your computer and use it in GitHub Desktop.
Save trytone/ea2a5010cab79e4c608e8034f7f87e72 to your computer and use it in GitHub Desktop.
RDM6300 125kHz RFID Arduino Reader
#include <SoftwareSerial.h>
const int BUFFER_SIZE = 14; // RFID DATA FRAME FORMAT: 1byte head (value: 2), 10byte data (2byte version + 8byte tag), 2byte checksum, 1byte tail (value: 3)
const int DATA_SIZE = 10; // 10byte data (2byte version + 8byte tag)
const int DATA_VERSION_SIZE = 2; // 2byte version (actual meaning of these two bytes may vary)
const int DATA_TAG_SIZE = 8; // 8byte tag
const int CHECKSUM_SIZE = 2; // 2byte checksum
SoftwareSerial ssrfid = SoftwareSerial(6,8); // RX, TX
uint8_t buffer[BUFFER_SIZE]; // used to store an incoming data frame
int buffer_index = 0;
void setup() {
Serial.begin(9600);
ssrfid.begin(9600);
ssrfid.listen();
Serial.println(" INIT DONE");
}
void loop() {
if (ssrfid.available() > 0){
bool call_extract_tag = false;
int ssvalue = ssrfid.read(); // read
if (ssvalue == -1) { // no data was read
return;
}
if (ssvalue == 2) { // RDM630/RDM6300 found a tag => tag incoming
buffer_index = 0;
} else if (ssvalue == 3) { // tag has been fully transmitted
call_extract_tag = true; // extract tag at the end of the function call
}
if (buffer_index >= BUFFER_SIZE) { // checking for a buffer overflow (It's very unlikely that an buffer overflow comes up!)
Serial.println("Error: Buffer overflow detected! ");
return;
}
buffer[buffer_index++] = ssvalue; // everything is alright => copy current value to buffer
if (call_extract_tag == true) {
if (buffer_index == BUFFER_SIZE) {
unsigned tag = extract_tag();
} else { // something is wrong... start again looking for preamble (value: 2)
buffer_index = 0;
return;
}
}
}
}
unsigned extract_tag() {
uint8_t msg_head = buffer[0];
uint8_t *msg_data = buffer + 1; // 10 byte => data contains 2byte version + 8byte tag
uint8_t *msg_data_version = msg_data;
uint8_t *msg_data_tag = msg_data + 2;
uint8_t *msg_checksum = buffer + 11; // 2 byte
uint8_t msg_tail = buffer[13];
long tag = hexstr_to_value(msg_data_tag, DATA_TAG_SIZE);
long checksum = 0;
for (int i = 0; i < DATA_SIZE; i+= CHECKSUM_SIZE) {
long val = hexstr_to_value(msg_data + i, CHECKSUM_SIZE);
checksum ^= val;
}
if (checksum == hexstr_to_value(msg_checksum, CHECKSUM_SIZE)) { // compare calculated checksum to retrieved checksum
for (int i = 0; i < DATA_VERSION_SIZE; ++i) {
Serial.print(char(msg_data_version[i]));
}
Serial.println(" (version)");
for (int i = 0; i < DATA_TAG_SIZE; ++i) {
Serial.print(char(msg_data_tag[i]));
}
Serial.println(" (tag)");
Serial.print("Extracted Tag (int): ");
Serial.println(tag);
Serial.println("--------");
}
return tag;
}
long hexstr_to_value(char *str, unsigned int length) { // converts a hexadecimal value (encoded as ASCII string) to a numeric value
char* copy = malloc((sizeof(char) * length) + 1);
memcpy(copy, str, sizeof(char) * length);
copy[length] = '\0';
// the variable "copy" is a copy of the parameter "str". "copy" has an additional '\0' element to make sure that "str" is null-terminated.
long value = strtol(copy, NULL, 16); // strtol converts a null-terminated string to a long value
free(copy); // clean up
return value;
}
/*
ARDUINO UNO R3
+-----+
+----[PWR]-------------------| USB |--+ RDM6300
| +-----+ |
| GND/RST2 [ ][ ] | +-----------------+
| MOSI2/SCK2 [ ][ ] A5/SCL[ ] | +=======|[*]TX LED[ ]|
| 5V/MISO2 [ ][ ] A4/SDA[ ] | | |[ ]RX +5V[ ]|
| AREF[ ] | | |[ ] GND[ ]|
| GND[*]=|===========|[*]GND |
| [ ]N/C SCK/13[ ] | | +===|[*]+5V |
| [ ]IOREF MISO/12[ ] | | | | |
| [ ]RST MOSI/11[ ]~| | | | |
| [ ]3V3 +---+ 10[ ]~| | | |[ ]C2D |
| [ ]5v -| A |- 9[ ]~| | | |[ ]C2CK |
| [ ]GND -| R |- 8[ ] | | | |[ ]VDD |
| [ ]GND -| D |- | | | |[ ]GND |
| [ ]Vin -| U |- 7[ ] | | | | |
| -| I |- 6[*]=|===+ | | |
| [ ]A0 -| N |- 5[ ]~| | | ANT2[ ]|
| [ ]A1 -| O |- 4[ ] | | | ANT1[ ]|
| [ ]A2 +---+ INT1/3[ ]~| | +-----------------+
| [ ]A3 INT0/2[ ] | |
| [ ]A4/SDA RST SCK MISO TX>1[ ] | |
| [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | |
| [ ] [ ] [*] 5V | |
| GND MOSI | ____________/ |
\____________________|__/ |
| |
+=======================+
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment