RFID Reader mit einfachen if-Bedingungen

Hey,

ich habe hier den 125Khz RFID RDM6300 reader und möchte damit lediglich Tags auslesen und mit if-Bedingungen darauf reagieren. Ich habe etliche Beispielcodes ausprobiert, weil ich selbst nicht sooo gut programmieren kann. Leider sind die Beispielcodes meistens viel zu überdimensioniert für mein Vorhaben, daher wollte ich hier mal nachfragen. Der Code sollte eigentlich nur folgendes beinhalten:
ID auslesen -> mit vorgegebener ID abgleichen -> darauf reagieren. Es gibt drei Tags auf die reagiert werden soll, bei anderen soll einfach nichts geschehen. Ich habe soweit diesen Code gebastelt und dabei wohl zu einfach gedacht, denn die Abfrage funktioniert nicht.

char val = 0;

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

void loop () {
  if(Serial.available() > 0) {
    read();
  }
  auswerten();
}

void read(){
  val = Serial.read();
  Serial.print(val);
}

void auswerten(){
  if(val == '2800C4C02804'){
    ...
  }
  if(val == '...'){
    ...
  }
  if(val == '...'){
    ...
  }
}

Aus anderen Beispielcodes konnte ich nicht viel gewinnen, da sie einen imens größeren Umfang haben und mich nur verwirren :confused:

Hat jemand eine Idee wie mir diese einfache Abfrage gelingen kann?

Viele Grüße
Dennis

char val = 0;
if(val == '2800C4C02804')

Das enthält leider schonmal 3 Fehler :wink:

  1. char ist ein einzelner Buchstabe, du brauchst Platz für 12, sowie einer EndeKennung, also ein char val[13].
  2. Einzelne Anführungszeichen kennzeichnen einzelne Buchstaben. "2800C4C02804" ist was anderes.
  3. Zwei Texte kann man nicht mit == vergleichen. ( Zur Verwirrung: Dies würde nur wahr ergeben, wenn beide auf den gleichen Speicherplatz zeigen )
    Du meinst strcmp

Dass du auch nur ein Zeichen einliest, sollte dir auch klar sein. Leider ist es tatsächlich ein wenig komplizerter als in deinem Code.
Schau mal den anderen aktuellen Thread über RFID Reader an, ob da Anregungen für dich sind.

michael_x:

char val = 0;
if(val == '2800C4C02804')

Das enthält leider schonmal 3 Fehler :wink:

  1. char ist ein einzelner Buchstabe, du brauchst Platz für 12, sowie einer EndeKennung, also ein char val[13].
  2. Einzelne Anführungszeichen kennzeichnen einzelne Buchstaben. "2800C4C02804" ist was anderes.
  3. Zwei Texte kann man nicht mit == vergleichen. ( Zur Verwirrung: Dies würde nur wahr ergeben, wenn beide auf den gleichen Speicherplatz zeigen )
    Du meinst strcmp

Dass du auch nur ein Zeichen einliest, sollte dir auch klar sein. Leider ist es tatsächlich ein wenig komplizerter als in deinem Code.
Schau mal den anderen aktuellen Thread über RFID Reader an, ob da Anregungen für dich sind.

Hallo,

besten Dank für die Aufklärung. Ja da lese ich parallel mit und probiere weiter aus. Ich müsste also die Zeichen vom Referenztag und gelesenem Tag in ein Array legen und diese (Arrays) dann vergleichen? Oder gibt es noch eine Möglichkeit die Zeichen in strings zu legen und diese dann zu vergleichen?

Viele Grüße
Dennis

gibt es noch eine Möglichkeit die Zeichen in Strings zu legen und diese dann zu vergleichen?

Ja , aber : Was, glaubst du, dass ein String - Vergleich macht ?
In der Regel "zersplittert" er ausserdem noch zusätzlich deinen RAM in dynamisch belegte Teile, so dass du das höchstens in einem kleinen Test innerhalb der setup Routine ausprobieren kannst.

( Kann sogar sein, dass es mit Strings von immer der gleichen Länge gut geht, aber nur um strcmp durch == und strcpy durch = zu ersetzen, lohnt es nicht, das auszuprobieren, finde ich. )

laemmen:
Es gibt drei Tags auf die reagiert werden soll, bei anderen soll einfach nichts geschehen. Ich habe soweit diesen Code gebastelt und dabei wohl zu einfach gedacht, denn die Abfrage funktioniert nicht.

Das wird ja immer mehr an Leuten im Forum, die ihren RFID-Reader nicht ausgelesen bekommen!

Ich habe zwar keinen RFID-Reader, aber aufgrund des jetzt schon wieder auftretenden Dramas habe ich mir jetzt mal das Datenformat des Readers im Datenblatt angesehen.

Gesendet wird von dem RDM6300 Reader beim seriellen Auslesen offenbar folgendes:

  • "Start Text" Steuerzeichen ASCII-2 (1 Byte)
  • 10 ASCII Zeichen "Nummer" (10 Bytes)
  • 2 ASCII Zeichen "Prüfnummer" (2 Bytes)
  • "End Text" Steuerzeichen ASCII-3 (1 Byte)

Ich habe nun mal "blind" einen Code dafür gebastelt.
Es gibt im Demo-Code drei Nummern für Mike, Bill und Bob, die erkannt werden können.
Im Echtbetrieb testen kann ich den Code nicht, wie gesagt, ich habe keinen solchen Reader.

Falls der Reader nicht an der Hardware-Serial angeschlossen ist, sondern an einer Soft-Serial, müssen natürlich alle read-Lesebefehle auf die tatsächlich verwendete Serial-Schnittstelle umgeschrieben werden.

Vielleicht haut's ja direkt hin.

// RFID demo sketch by "jurs" for Arduino Forum Deutsch

// start text character
#define STX 2
// end text character
#define ETX 3

// buffer to hold the last code read from Serial
char rfidBufferLastRead[13];

boolean readRFID() 
{
  if (!Serial.available()) return(false); // nothing available to read
  char rfidBuffer[13];
  char c=0;
  int i=0;
  memset(rfidBuffer,0,sizeof(rfidBuffer)); // clear receive buffer
  delay(50); // wait for code to appear in the Serial input buffer
  while (Serial.available()&& c!=STX) // watch out for start of text character
    c=Serial.read();
  while (Serial.available()&& i<12 && c!=ETX) // watch out for end of text character
  {
    c=Serial.read();
    rfidBuffer[i] = c;
    i++;
  }
  if (i!=12) return(false); // less than 12 characters read from Serial
  if (Serial.available()) c=Serial.read();
  if (c!=ETX) return(false);
  strncpy(rfidBufferLastRead,rfidBuffer,sizeof(rfidBuffer)); // copy into global variable rfidBufferLastRead
  return(true); // if we reach this line, we have read 12 digits from Serial
}

 
void setup()
{
  Serial.begin(9600);
  Serial.println("waiting for RFID...");
}

void loop()
{
  if (readRFID())
  {
    if (strcmp(rfidBufferLastRead,"2800C4C02804")==0)
      Serial.println("Hello Mike!");
    else if (strcmp(rfidBufferLastRead,"123456789012")==0)
      Serial.println("Hello Bill!");
    else if (strcmp(rfidBufferLastRead,"800C4C028042")==0)
      Serial.println("Hello Bob!");
    else 
    {
      Serial.print("Fuck off! ");  
      Serial.println(rfidBufferLastRead);
    }  
  }
}

jurs:

laemmen:
Es gibt drei Tags auf die reagiert werden soll, bei anderen soll einfach nichts geschehen. Ich habe soweit diesen Code gebastelt und dabei wohl zu einfach gedacht, denn die Abfrage funktioniert nicht.

Das wird ja immer mehr an Leuten im Forum, die ihren RFID-Reader nicht ausgelesen bekommen!

Ich habe zwar keinen RFID-Reader, aber aufgrund des jetzt schon wieder auftretenden Dramas habe ich mir jetzt mal das Datenformat des Readers im Datenblatt angesehen.

Gesendet wird von dem RDM6300 Reader beim seriellen Auslesen offenbar folgendes:

  • "Start Text" Steuerzeichen ASCII-2 (1 Byte)
  • 10 ASCII Zeichen "Nummer" (10 Bytes)
  • 2 ASCII Zeichen "Prüfnummer" (2 Bytes)
  • "End Text" Steuerzeichen ASCII-3 (1 Byte)

Ich habe nun mal "blind" einen Code dafür gebastelt.
Es gibt im Demo-Code drei Nummern für Mike, Bill und Bob, die erkannt werden können.
Im Echtbetrieb testen kann ich den Code nicht, wie gesagt, ich habe keinen solchen Reader.

Falls der Reader nicht an der Hardware-Serial angeschlossen ist, sondern an einer Soft-Serial, müssen natürlich alle read-Lesebefehle auf die tatsächlich verwendete Serial-Schnittstelle umgeschrieben werden.

Vielleicht haut's ja direkt hin.

Wow, vielen herzlichen Dank! Funktioniert grandios! :slight_smile:

Viele Grüße
Dennis