Статус выхода 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 и пытаюсь его отредактировать.
@Dahacker305, 👍1
Обсуждение2 ответа
Лучший ответ:
Я бы не стал использовать 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
сравнивает блок памяти по указанному вами количеству байтов. При совпадении возвращает ноль.
Возможно, вам нужно что-то вроде:
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
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Глобальные переменные занимают много места в динамической памяти.
- Почему Adafruit motor shield не крутит моторы?
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Библиотека программных материалов для плат SAMD
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Определение относительно точной скорости с помощью ИДУ
Вероятно, вам не нужен знак «=» в операторе if. В каком примере это было?, @Dave X
Это то, что я добавил, но все еще новое, так что я должен ввести?, @Dahacker305
Для сравнения вы используете
==
.=
для присваивания. Распространенная ошибка даже профессионалов., @Gerben