Как добавить условие в пример 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");
    }
}

, 👍0

Обсуждение

= - это оператор присваивания. вы не можете использовать константную инициализацию для присвоения значения переменной . В условии if обычно используется оператор сравнения '==', и его нельзя использовать для сравнения массивов., @Juraj

ну, то же самое, если я использую == и если я не могу сравнивать массивы, так как же правильно сделать, чтобы это произошло, например, если серийный номер карты / uid - это то, что я хочу предоставить доступ и успех печати, есть ли способ сделать что?, @Abdalrahman Gamal

Вы должны сравнивать каждое значение в массиве один раз за раз. Например, если (uid[0]== 0xF0 && uid[1]==0x21 && ...)`, @chrisl

Можете ли вы порекомендовать курс для меня, который может привести меня к этому так быстро, как я могу, у меня меньше 3 месяцев, чтобы закончить этот проект, я понятия не имею об arduino или C++, мой колледж поставил меня в эту ситуацию, которую я не знал даже ничего не изучал в электронике и даже в c++, @Abdalrahman Gamal

@AbdalrahmanGamal, лол, мне очень любопытно .... вы использовали утверждение «Я хочу» в своем посте .... я видел, как многие люди используют его .... мне интересно, как вы узнали слово "хочу"? .... это не слово в английском языке, между прочим... заявление должно быть "я хочу", @jsotola


1 ответ


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), или отрицательное или положительное число, если единица меньше или больше " другой.

,