Статус выхода 1 ожидаемое первичное выражение перед ']' Arduino

Вот и вся ошибка:

 Arduino: 1.6.7 (Windows 7), Board: "Arduino/Genuino Uno"

 *\readMifare\readMifare.ino: In function 'void loop()':

 readMifare:113: error: expected primary-expression before ']' token

    if (uid[] == { 0x04, 0xEC, 0x89, 0x32, 0x55, 0x42, 0x80 }) {

            ^

 readMifare:113: error: expected primary-expression before '{' token

    if (uid[] == { 0x04, 0xEC, 0x89, 0x32, 0x55, 0x42, 0x80 }) {

                 ^

 readMifare:113: error: expected ')' before '{' token

 readMifare:121: error: expected '}' at end of input

    }

    ^

 exit status 1
 expected primary-expression before ']' token

   This report would have more information with
   "Show verbose output during compilation"
   enabled in File > Preferences.

Вот код

 #include <Wire.h>
 #include <SPI.h>
 #include <Adafruit_PN532.h>

 // При использовании прорыва с SPI определите контакты для связи SPI.
 #define PN532_SCK  (2)
 #define PN532_MOSI (3)
 #define PN532_SS   (4)
 #define PN532_MISO (5)
 // При использовании прорыва или экрана с I2C определите только подключенные контакты
 // на линии прерывания и сброса. Используйте значения ниже (2, 3) для щита!
 #define PN532_IRQ   (2)
 #define PN532_RESET (3)  // По умолчанию не подключен к NFC Shield

 // Раскомментируйте только _одну_ строку ниже в зависимости от того, как ваш прорыв или щит
 // подключен к Arduino:

 // Используйте эту строку для прорыва с программным соединением SPI (рекомендуется):
 Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

 // Используйте эту строку для прорыва с аппаратным соединением SPI. Обратите внимание, что
 // контакты PN532 SCK, MOSI и MISO должны быть подключены к Arduino
 // аппаратные контакты SPI SCK, MOSI и MISO. На Arduino Uno это
 // SCK = 13, MOSI = 11, MISO = 12. Линия SS может быть любым выводом цифрового ввода-вывода.
 // Adafruit_PN532 nfc (PN532_SS);

 // Или используйте эту строку для прорыва или щита с соединением I2C:
 // Adafruit_PN532 nfc (PN532_IRQ, PN532_RESET);

 #if defined(ARDUINO_ARCH_SAMD)
 // для Zero, вывод на последовательную консоль USB, удалите строку ниже, если для программирования Zero используется порт программирования!
 // также измените #define в файле библиотеки Adafruit_PN532.cpp
 #define Serial SerialUSB
 #endif
 #include <Servo.h>

 Servo servo1;

 void setup(void) {
   #ifndef ESP8266
   while (!Serial); // для Леонардо/Микро/Зеро
   #endif
   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);

   // настроить плату для чтения RFID-меток
   nfc.SAMConfig();

   Serial.println("Waiting for an ISO14443A Card ...");
   servo1.attach(9); 
 }


 void loop(void) {
   uint8_t 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, &uidLength);

   if (uid[] = { 0x04, 0xEC, 0x89, 0x32, 0x55, 0x42, 0x80 }) {

      int position;
      for(position = 0; position < 180; position += 2){
       servo1.write(position);
       delay(20);
      }

   }

Обратите внимание, что я использую пример из примеров официальной библиотеки Adafruit PN532 и пытаюсь его отредактировать.

, 👍1

Обсуждение

Вероятно, вам не нужен знак «=» в операторе if. В каком примере это было?, @Dave X

Это то, что я добавил, но все еще новое, так что я должен ввести?, @Dahacker305

Для сравнения вы используете ==. = для присваивания. Распространенная ошибка даже профессионалов., @Gerben


2 ответа


Лучший ответ:

3

Я бы не стал использовать strncmp, потому что в UID могут быть нули. Это выглядит безопаснее:

   uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Буфер для хранения возвращенного UID
   uint8_t uidLength;                        // Длина UID (4 или 7 байт в зависимости от типа карты ISO14443A)

   const uint8_t wantedUid [] = { 0x04, 0xEC, 0x89, 0x32, 0x55, 0x42, 0x80 };

   // Ждем карты типа ISO14443A (Mifare и т.п.). Когда один найден
   // 'uid' будет заполнен UID, а uidLength будет указывать
   // если uid равен 4 байтам (Mifare Classic) или 7 байтам (Mifare Ultralight)
   success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);

   if (success && 
      uidLength == sizeof (wantedUid) &&
      memcmp (uid, wantedUid, sizeof wantedUid) == 0) {
      ...

Я проверил, что uidLength является ожидаемым размером, иначе вы можете обнаружить, что 4-байтовая карта соответствует первым четырем байтам нужного UID.

memcmp сравнивает блок памяти по указанному вами количеству байтов. При совпадении возвращает ноль.

,

1

Возможно, вам нужно что-то вроде:

uint8_t uidTarget[] = { 0x04, 0xEC, 0x89, 0x32, 0x55, 0x42, 0x80 };

...
if (success && !strncmp((const char*) uidTarget,(const char*)uidSource,8)) {

Ваш '=' пытается выполнить присваивание, а '==' будет проверять, идентичны ли указатели на массивы, а не содержимое массивов. strncmp() проверяет равенство строк символов, а (const char*) преобразует значения uint8_t в символы.

Ответ Ника Гэммона лучше.

,

добавил то, что вы сказали мне добавить, ошибка: readMifare: 113: ошибка: неверное преобразование из uint8_t* {aka unsigned char*} в 'const char*' [-fpermissive] если (успех && !strncmp(uid,{ 0x04, 0xEC, 0x89, 0x32, 0x55, 0x42, 0x80 },8)) { readMifare: 113: ошибка: невозможно преобразовать «<список инициализаторов, заключенных в фигурные скобки>» в «const char*» для аргумента «2» в «int strncmp (const char*, const char*, size_t)» readMifare: 121: ошибка: ожидается '}' в конце ввода } статус выхода 1 недопустимое преобразование из 'uint8_t* {он же unsigned char*}' в 'const char*' [-fpermissive], @Dahacker305

@Dahacker305: удалите const., @Edgar Bonet

"if (success && !strncmp(uid, {0x04, 0xEC, 0x89, 0x32, 0x55, 0x42, 0x80 },8))" - нет, вы не можете этого сделать. ID должен быть переменной массива., @Mikael Patel