Как добавить условие в пример RFID?
С помощью модуля Arduino Mega 2560 и PN532 NFC/RFID я хочу иметь возможность сканировать карту и проверять, соответствует ли ее значение (0xF0, 0x21, 0x5D, 0xA7). Он должен напечатать "accepted"
в последовательном мониторе.
Однако во время компиляции он продолжает говорить мне:
iso14443a_uid:99:11: error: expected primary-expression before ']' token
if (uid[] = {0xF0, 0x21, 0x5D, 0xA7}){
^
exit status 1 expected primary-expression before ']' token
Это мой код:
/****************************************************** ****************************/ /*! В этом примере будет предпринята попытка подключения к ISO14443A. карты или тега и получить некоторую основную информацию о нем это может быть использовано для определения типа карты.
Обратите внимание, что скорость передачи должна быть 115200, потому что нам нужно печатать
из данных и чтения с карты в то же время!
Чтобы включить отладочное сообщение, определите DEBUG в PN532/PN532_debug.h.
*/
/********************************************************* *************************/
/* When the number after #if set as 1, it will be switch to SPI Mode*/
#if 0
#include <SPI.h>
#include <PN532_SPI.h>
#include "PN532.h"
PN532_SPI pn532spi(SPI, 10);
PN532 nfc(pn532spi);
/* When the number after #elif set as 1, it will be switch to HSU Mode*/
#elif 0
#include <PN532_HSU.h>
#include <PN532.h>
PN532_HSU pn532hsu(Serial1);
PN532 nfc(pn532hsu);
/* When the number after #if & #elif set as 0, it will be switch to I2C Mode*/
#else
#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
PN532_I2C pn532i2c(Wire);
PN532 nfc(pn532i2c);
#endif
void setup(void) {
Serial.begin(115200);
Serial.println("Hello!");
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
Serial.print("Didn't find PN53x board");
while (1); // остановка
}
// Данные в порядке, распечатайте их!
Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
// Установить максимальное количество повторных попыток чтения с карты
// Это предотвратит вечное ожидание карты, которая
// поведение PN532 по умолчанию.
nfc.setPassiveActivationRetries(0xFF);
// настроить плату для чтения RFID-меток
nfc.SAMConfig();
Serial.println("Waiting for an ISO14443A card");
}
void loop(void) {
boolean success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Буфер для хранения возвращенного UID
uint8_t uidLength; // Длина UID (4 или 7 байт в зависимости от типа карты ISO14443A)
// Ждем карты типа ISO14443A (Mifare и т.п.). Когда один найден
// 'uid' будет заполнен UID, а uidLength будет указывать
// если uid равен 4 байтам (Mifare Classic) или 7 байтам (Mifare Ultralight)
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
if (success) {
Serial.println("Found a card!");
Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
Serial.print("UID Value: ");
for (uint8_t i=0; i < uidLength; i++)
{
Serial.print(" 0x");Serial.print(uid[i], HEX);
}
Serial.println("");
// Подождите 1 секунду, прежде чем продолжить
delay(1000);
}
else
{
// PN532, вероятно, истекло время ожидания карты
Serial.println("Timed out waiting for a card");
}
if (uid[] = {0xF0, 0x21, 0x5D, 0xA7}){
Serial.println("Success");
}
}
1 ответ
Как было отмечено в комментариях, вы не можете сравнивать такие массивы. Вместо этого вам нужно перебирать каждую запись и сравнивать отдельные элементы.
Если это всего несколько записей, вы можете сделать это вручную:
if ((uid[0] == 0xF0) && (uid[1] == 0x21) && (uid[2] == 0x5D) && uid[3] == 0xA7) {
// ...
}
Если ваши значения находятся в массивах, вы можете использовать функцию memcmp()
для их сравнения:
uint8_t compare[] = {0xf0, 0x21, 0x5d, 0xa7};
if (memcmp(uid, compare, 4) == 0) {
// ...
}
memcmp
возвращает 0, если два массива совпадают с заданным количеством байтов (в данном случае 4), или отрицательное или положительное число, если единица меньше или больше " другой.
- Почему я получаю ошибку "SendCommand не был объявлен"
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Использование RFID-RC522 с другими контактами
- Arduino и 2 модуля Adafruit Fingerprint работающие вместе
- Возникла проблема с переобъявлением символа другого типа
- Использовать Ethernet Shield и RFID rc522 вместе на мега
- Совместное использование RFID и датчика отпечатков пальцев
- Непрерывное считывание RFID-метки RDM6300
=
- это оператор присваивания. вы не можете использовать константную инициализацию для присвоения значения переменной . В условииif
обычно используется оператор сравнения '==', и его нельзя использовать для сравнения массивов., @Jurajну, то же самое, если я использую == и если я не могу сравнивать массивы, так как же правильно сделать, чтобы это произошло, например, если серийный номер карты / uid - это то, что я хочу предоставить доступ и успех печати, есть ли способ сделать что?, @Abdalrahman Gamal
Вы должны сравнивать каждое значение в массиве один раз за раз. Например, если (uid[0]== 0xF0 && uid[1]==0x21 && ...)`, @chrisl
Можете ли вы порекомендовать курс для меня, который может привести меня к этому так быстро, как я могу, у меня меньше 3 месяцев, чтобы закончить этот проект, я понятия не имею об arduino или C++, мой колледж поставил меня в эту ситуацию, которую я не знал даже ничего не изучал в электронике и даже в c++, @Abdalrahman Gamal
@AbdalrahmanGamal, лол, мне очень любопытно .... вы использовали утверждение «Я хочу» в своем посте .... я видел, как многие люди используют его .... мне интересно, как вы узнали слово "хочу"? .... это не слово в английском языке, между прочим... заявление должно быть "я хочу", @jsotola