Forum: Mikrocontroller und Digitale Elektronik Arduino leonardo invalid suffix "B9FD4" umgehen


von Tom F. (tom_f)


Angehängte Dateien:

Lesenswert?

Halo, ich habe einen Arduino Leonardo und möchte damit per rfid meinen 
pc entsperren. Im code funktioniert auch alles außer wenn ich dann die 
kartennummer in einer if Bedingung abfrage, wie dann folgender error 
kommt:
1
invalid suffix "B9FD4" on integer constant

wie kann man den error umgehen? Ich dachte mir daß man evtl.. die 
kartennummer (B9FD4) durch eine zahlenrehnfolge (bsp: 123456) ersetzt, 
also daß wenn ich in der if Bedingung statt der richtigen kartennummer 
B9FD4 die zahlen 123456 einsetze es die zahlen 123456 zu der 
kartennummer "verlinkt".

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Tom F. schrieb:
> if(ShowCardID(uchar *id))== 861B9FD4){

Das ist keine Dezimalzahl, sondern soll eine Hexadezimalzahl sein.

Wie werden in C-artigen Sprachen hexadezimale Konstanten geschrieben? 
Na?

Richtig: Durch Voranstellen von 0x.

von Tom F. (tom_f)


Lesenswert?

Das habe ich schon probiert, aber dann kommt folgender error:
1
expected primary-expression before 'unsigned'
in Zeile 5

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ich zähl' jetzt nicht nach. Welche ist Zeile 5?

Übrigens: Welchen  Teil von

Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang 
hast Du nicht verstanden?

von Tom F. (tom_f)


Lesenswert?

Okay, ich habe den code jetzt als Datei eingefügt, und mit zeile 5 meine 
ich das die error Meldung diese zeile makiert hat
1
#define uchar unsigned char

*Die if abfrage ist ganz unten im code

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Schön.

Das wird ein Folgefehler aus einer der vorher eingebundenen 
Headerdateien sein.

Oder eine Interaktion mit der Arduino-Umgebung, die sich gerade was 
#defines, Includedateien etc. angeht, doch deutlich von C/C++ 
unterscheidet.

von Michael U. (amiga)


Lesenswert?

Hallo,

ich bin kein C-Präprozessor-Spezi, ich würde aber mal vermuten, daß
#define uchar unsigned char

uchar = unsigned setzt und dann nichts mehr mit char anzufangen weiß.
Letztlich wird ja nur Text ersetzt.

Man kann auch genausogut byte statt unsgned char nehmen, das ist 8Bit 
und unsigned.
Man kann auch die Standardtypen includen und dann uint8_t nehmen.

Die ArduinoIDE ist mit Sicherheit nicht der Weisheut letzter Schluß, 
aber sie macht eigentlich durchaus was man ihr sagt. ;)

Gruß aus Berlin
Michael

von lambda (Gast)


Lesenswert?

ShowCardID() ist übrigends auch void, da wird bei dem Vergleich wenig 
passieren.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael U. schrieb:
> ich würde aber mal vermuten

Nein. Das ist legitim.

Man könnte statt des #defines allerdings auch ein saubereres typedef 
verwenden.

von Michael U. (amiga)


Lesenswert?

Hallo,

Rufus Τ. F. schrieb:
> Michael U. schrieb:
>> ich würde aber mal vermuten
>
> Nein. Das ist legitim.
>
> Man könnte statt des #defines allerdings auch ein saubereres /typedef/
> verwenden.

Danke für den Hinweis, wieder 2 Seiten C-Lektüre gespart. ;-)

Gruß aus Berlin
Michael

von Dieter F. (Gast)


Lesenswert?

Also der Teil

http://smart-prototyping.com/image/data/2_components/Arduino/100985%20Mifare%20RC522%20RFID%20Reader%20IC%20Card%20Proximity%20Module/code.txt

sollte funktionieren - es liegt also wahrscheinlich rein an Deinen 
Ergänzungen:
1
...
2
#include <MFRC522.h>
3
...
4
if(ShowCardID(uchar *id))== 0x861B9FD4){
5
     //Send the message
6
          Keyboard.press(ctrlKey);
7
    Keyboard.release(ctrlKey);
8
     Keyboard.print("0152");
9
          Keyboard.press(ctrlKey);
10
    Keyboard.release(ctrlKey);
11
   }

Ob der Einbau der Lib so ohne Initialisierung Werte liefern kann - und 
ob das dann auch alles korrekt zusammenspielt kann ich so nicht 
überblicken ...

von Carl D. (jcw2)


Lesenswert?

Hat mal jemand einfach nur die Klammern hinter if durchgezählt?

von Ulrich F. (Gast)


Lesenswert?

Carl D. schrieb:
> Hat mal jemand einfach nur die Klammern hinter if durchgezählt?
Ich kann nicht zählen! ;-)

Dieter F. schrieb:
> if(ShowCardID(uchar *id))== 0x861B9FD4)

1. Die Hexzahl ist aller mindestens long
2. ShowCardID() hat keine Rückgabe

Das Versagen ist also fest eingebaut.

von Carl D. (jcw2)


Lesenswert?

0. Das == ist außerhalb von if()

> expected primary-expression before 'unsigned'
> in Zeile 5

Statt
1
if(ShowCardID(uchar *id))== 0x861B9FD4){
besser
1
if( ShowCardID(uchar *id) == 0x861b9fd4UL ){
das mit dem UL hab ich gleich mal dazugetan.

von Tom F. (tom_f)


Lesenswert?

Okey, erstmal danke für die vielen schnellen antworten ;) leider 
funktioniert es immer noch nicht. Hat vielleicht jemand noch einen 
anderen Leonardo kompatiblen code mit dem man die rfid kartennummer 
auslesen und später in der if abfrage verwenden kann?

von Ulrich F. (Gast)


Lesenswert?

Tom F. schrieb:
> Okey, erstmal danke für die vielen schnellen antworten ;) leider
> funktioniert es immer noch nicht. Hat vielleicht jemand noch einen
> anderen Leonardo kompatiblen code mit dem man die rfid kartennummer
> auslesen und später in der if abfrage verwenden kann?

Möchtest du nicht lieber erstmal die Sprache lernen, die du da 
verwendest?

Denn das
> ShowCardID(uchar *id)
in
> if( ShowCardID(uchar *id) == 0x861b9fd4UL )
sieht mir eher wie eine Funktionssignatur aus. Das ist kein 
Funktionsaufruf.
Und wie schon gesagt, diese Funktion hat keinen Rückgabewert.

Mit einem anderen Code wirst du die selben Probleme bekommen.

von Dieter F. (Gast)


Lesenswert?

Tom F. schrieb:
> Hat vielleicht jemand noch einen
> anderen Leonardo kompatiblen code mit dem man die rfid kartennummer
> auslesen und später in der if abfrage verwenden kann?

Äh, hier
1
  // str[0..3]: serial number of the card
2
    // str[4]: XOR checksum of the SN.
3
    if (status == MI_OK)
4
    {
5
        Serial.print("The card's number is: ");
6
        memcpy(serNum, str, 5);
7
        ShowCardID(serNum);
8
    
9
        // Check people associated with card ID
10
        uchar* id = serNum;
11
        if( id[0]==0x23 && id[1]==0x4B && id[2]==0x54 && id[3]==0xB6 ) {
12
            Serial.println("Hello Mary!");
13
        } else if(id[0]==0x87 && id[1]==0x05 && id[2]==0x6C && id[3]==0x55) {
14
            Serial.println("Hello Greg!");
15
        }else{
16
            Serial.println("Hello unkown guy!");
17
        }
18
    }

wird die Kartennummer "in einer IF-Abfrage" abgefragt - oder?

Dort Deine paar Keyboard-Befehle unterzubringen sollte eigentlich nicht 
schwer sein ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.