Hallo,
ich hab tatsächlich noch ein GPIO-Port frei, den möchte ich meiner Lieblingskarte zuordnen. Nur komme ich mit der Syntax nicht zurecht. Wenn der Port Low ist soll die Karte abspielen.
Es geht um folgende Zeile:
xQueueSend(rfidCardQueue, &cardIdString, 0);
Wie kann ich z.B. die Karte „041250080155“ da an Stelle des &cardIdString bringen, damit die Karte abgespielt wird? Oder stelle ich mir das zu einfach vor?
zuordnen und dann deren Anfangsadresse an die Funktion übergeben.
xQueueSend(rfidCardQueue, lieblingsKarte, 0);
Wäre jedenfalls mein Tipp. So firm bin ich aber auch noch nicht in der Codebasis hier. Mir ist z.B. nicht klar, wie lang die Variable „lebt“, sodass die Adresse noch verfügbar ist, wenn die Informationen gebraucht wird.
Vielleicht musst Du die Variable etwas globaler deklarieren. Meine Befürchtung ist, dass auf die Addresse erst nach beendigung der Funktion zurückgegriffen wird und die dann illegal ist. Da müsste man aber mehr Ahnung von dem Threading haben vermute ich. Schau doch mal, wie die Funktion das macht, die die IDs einliest und dann weiterleitet.
Aber ist nicht char* schon ein Zeiger? Oder muss man noch eine Hierarchie „höher“ gehn? Bei Strings und Chars finde ich die Zeigerarithmetik immer verwirrend
@biologist @SeebM
Vielen Dank für eure Hinweise, mit dem kaufmännischen UND hatte ich heute nachmittag schon erfolglos probiert. Jetzt nochmals, damit ich mir sicher war. Einmal mit
char* lieblingsKarte=„041250080155“; und auch mit
char lieblingsKarte[25] = „041250080155“;
Wieder Absturz und Neustart.
Ich habe die Tasterabfrage allerdings im void loop…ist das evtl. ein Problem mit der Gültigkeit?
Sorry ich kenn mich so ganz und gar nicht aus, mit den Variablen, ob die global gültig sind, oder lokal, oder wo auch immer.
Das mit dem & habe ich halt einfach so ausprobiert, weils ja beim Einlesen der RFID Karte auch so da stand…hat aber leider auch nichts gebracht.
Ist evtl. der String der Karten-ID unvollständig? Kommt da noch ein verstecktes Zeichen oder Steuerzeichen vorne oder hinten dran?
Das passt. Hierbei wird automatisch ein char-Array mit passender Länge (n+1) erzeugt und entsprechend viel Platz im Speicher reserviert. Wo genau hast du diese Variable denn deklariert?
Wenn man zyklisch einen Taster abfragen will, dann hat man drei Möglichkeiten:
a) Mit jedem Zyklus in loop(). Ist recht einfach, aber in Abhängigkeit der Loopzeit des Sketches können sich Bedingungen halt ändern.
b) Per Interrupt: Da wird der µC quasi bei seinem Tun unterbrochen, wenn erkannt wird, dass die Taste gedrückt wurde. Wird oft gemacht, ich habe allerdings gelernt, dass man das eher nicht macht. Weil wenn ein Taster viel prellt kann das evtl. zu vielen Unterbrechungen führen.
c) Per Hardware-Timer: Da wird die CPU zyklisch unterbrochen und der Status des Buttons gepollt. Vorteil an dieser Variante ist, dass man immer definierte Verhältnisse hat. In meinem Code benutze ich z.B. 1000 Hz und so kann ich sicher sein, dass das immer genau so abläuft.
Wie dem auch sei: Was man bei einem Taster auf jeden Fall will ist Entprellen. Einerseits, weil ein Taster (siehe Link) erstmal einschwingt und dann auch, weil du so kurz gar nicht drücken kannst, dass du nur ein Event wirfst.
Wie auch immer: Ich persönlich bräuchte so einen Taster nicht, aber finde es legitim, dass man sowas gerne machen möchte. Ich schau mal, was man da machen kann.
hat mir für die idTest halt nur die Nummer ausgegeben „041250080155“. Aber evtl. wird durch das „%s“ was weggeschnitten?
@QDaniel
danke für den Hinweis. Ich verwende noch einen älteren commit, aber wenn ich auf den Neuen wechsle, dann probier ich deinen Hinweis gerne mal aus. Ist sicherlich formschöner, den Button so zu verwenden.
Aber wie oben bereits berichtet, funktioniert die Variable auch nicht einmal in der lastRfid Funktion.
Ich habe da nur lastRfid mit lieblingsKarte ersetzt…